170 похожих чатов

Разве в move конструкторе [1] не должно возникнуть противоречие, в

результате чего должен выбраться generated noexcept вместо defined?
template <typename T>
class A
{
T v;
public:
A() = default;
A(const A&) = default;

//A(A&&) = default;
A(A&&) noexcept(false) = default; [1]

A& operator=(const A&) = default;
A& operator=(A&&) = default;
};


int main()
{
std::cout << std::boolalpha;
std::cout << std::is_nothrow_move_constructible<A<std::string>>::value << '\n'; // false
}

9 ответов

20 просмотров

так он не генерируется в этом случае

А скажи, какой смысл в move для такого класса, что он будет перемещать?

Aleksandr-Bazhenov Автор вопроса
Егор (Дима)
так он не генерируется в этом случае

не понял ответ. У класса один член - std::string. У std::string move-конструктор noexcept. Следовательно если написать в классе A(A&&) = default, то у класса A move-конструктор так же будет noexcept. Теперь я пытаюсь явно переопределить это, используя conditional noexcept(false). И это работает. Но мне не понятно почему. Так как я прочитал, что если они противоречат, то выбор падает в пользу generated noexcept, а generated в свою очередь смотрит на все свои члены и если у всех move-конструктор noexcept, то и у класса будет noexcept.

Aleksandr Bazhenov
не понял ответ. У класса один член - std::string. ...

Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!

Aleksandr-Bazhenov Автор вопроса
Ilya Zviagin
А скажи, какой смысл в move для такого класса, чт...

я просто пытаюсь поглубже понять как это устроено

Aleksandr Bazhenov
не понял ответ. У класса один член - std::string. ...

Вроде noexcept на default вообще вешать нельзя. У меня по крайней мере компайл тайм ошибки были на кланге

Aleksandr-Bazhenov Автор вопроса
Слава
Вроде noexcept на default вообще вешать нельзя. У ...

можно. я же показал, что вывод false в main

Aleksandr-Bazhenov Автор вопроса
Ilya Zviagin
Я тоже...

тут может я как-то не правильно трактую слово "contradict" вот в этом тексте (C++ Move Semantics. Nicolai M. Josuttis). When you have a defaulted special member function you can explicitly specify a different noexcept guarantee than the generated one. For example: class C { ... public: C(const C&) noexcept = default; // guarantees not to throw (OK since C++20) C(C&&) noexcept(false) = default; // specifies that it might throw (OK since C++20) ... }; Before C++20, if the generated and specified noexcept condition contradict, the defined function was deleted.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта