Это продолжение этого вопроса: условное выражение оператора с базовым и константным классом не компилируется, почему?.
Ядро Cond? [cv] t1 (): [cv] t2 () , где, например, t2 публично наследуют от t1 .
Попытка следовать Правила для определения типа выражения, казалось, потребовалось неявную последовательность преобразования из производного объекта в базовый. Тем не менее были действительно просты: < /p>
struct X {};
struct Y : X {};
< /code>
и, таким образом, они имеют неявное перемещение по умолчанию и копирование конструкторов, которые могут позволить сформировать неявную последовательность преобразования. < /p>
Чтобы проверить эту гипотезу, Я попытался объяснить этих операторов, чтобы сломать последовательность преобразования: < /p>
#include
struct X {
X() = default;
explicit X(X const &) { std::cout
gcc < /th>
clang < /th>
msvc < /th>
< /tr>
< /thead>
< tbody>
none < /td>
перейти к базе < /td>
Перейти к базе < /td> перейти к Base < /td>
< /tr>
on Move только < /td>
< Strong> перейти на базу (ожидаемая копия)
копировать на базу
перейти к базе (ожидается копировать) < /td>
< /tr>
только на копирование < /td>
перейти на базу < /td> перейти к Base < /td>
перемещение в Base < /td>
< /tr>
Оба
перейти к базе (ожидаемая ошибка)
ошибка
ошибка
Мое ожидание было: если существует неявный конструктор движения, Используйте его в последовательности преобразования, в противном случае, если существует конструктор копирования, используйте его в последовательности преобразования, в противном случае неявная последовательность преобразования. < /p>
Почему выход отличается от компилятора до Другой, и почему они не соответствуют моим ожиданиям? Больше в соответствии с моими ожиданиями, за исключением MSVC: < /p>
void foo(X) {};
int main() { foo(Y()); }
< /code>
Live
В этом случае только MSVC ведет себя странно, всегда используя оператор движения. Я думаю, что это может быть ошибка MSVC.
Подробнее здесь: https://stackoverflow.com/questions/794 ... ce-used-fo
Условный оператор: несоответствие между неявной последовательности преобразования, используемой для разных компиляторов ⇐ C++
Программы на C++. Форум разработчиков
1739783808
Anonymous
Это продолжение этого вопроса: условное выражение оператора с базовым и константным классом не компилируется, почему?.
Ядро Cond? [cv] t1 (): [cv] t2 () , где, например, t2 публично наследуют от t1 .
Попытка следовать Правила для определения типа выражения, казалось, потребовалось неявную последовательность преобразования из производного объекта в базовый. Тем не менее были действительно просты: < /p>
struct X {};
struct Y : X {};
< /code>
и, таким образом, они имеют неявное перемещение по умолчанию и копирование конструкторов, которые могут позволить сформировать неявную последовательность преобразования. < /p>
Чтобы проверить эту гипотезу, Я попытался объяснить этих операторов, чтобы сломать последовательность преобразования: < /p>
#include
struct X {
X() = default;
explicit X(X const &) { std::cout
gcc < /th>
clang < /th>
msvc < /th>
< /tr>
< /thead>
< tbody>
none < /td>
перейти к базе < /td>
Перейти к базе < /td> перейти к Base < /td>
< /tr>
on Move только < /td>
< Strong> перейти на базу (ожидаемая копия)
копировать на базу
[b] перейти к базе [/b] (ожидается копировать) < /td>
< /tr>
только на копирование < /td>
перейти на базу < /td> перейти к Base < /td>
перемещение в Base < /td>
< /tr>
Оба
[b] перейти к базе [/b] (ожидаемая ошибка)
ошибка
ошибка
Мое ожидание было: если существует неявный конструктор движения, Используйте его в последовательности преобразования, в противном случае, если существует конструктор копирования, используйте его в последовательности преобразования, в противном случае неявная последовательность преобразования. < /p>
Почему выход отличается от компилятора до Другой, и почему они не соответствуют моим ожиданиям? Больше в соответствии с моими ожиданиями, за исключением MSVC: < /p>
void foo(X) {};
int main() { foo(Y()); }
< /code>
Live
В этом случае только MSVC ведет себя странно, всегда используя оператор движения. Я думаю, что это может быть ошибка MSVC.
Подробнее здесь: [url]https://stackoverflow.com/questions/79403418/conditional-operator-inconsistency-between-implicit-conversion-sequence-used-fo[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия