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 ответов

14 просмотров

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

А скажи, какой смысл в 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.

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

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

Какой-то там пердун в 90-х решил, что есть какая-то разная типизация. Кого вообще это волнует?
КТ315
49
void terminal_scroll() { memmove(terminal_buffer, terminal_buffer + VGA_WIDTH, buffer_size - VGA_WIDTH); memset(terminal_buffer + buffer_size - VGA_WIDTH, 0, VGA_WIDTH); ...
Егор
47
Всем привет! Подскажите, пожалуйста, в чем ошибка? Настраиваю подключение к MySQL. Либы лежат рядом с exe. Все как по "учебнику"
Евгений
16
А можете как-то проверить меня по знаниям по ассемблеру?
A A
132
Здравствуйте! У меня появилась возможность купить книгу "Изучай Haskell во имя добра!". Но я где-то слышал, что эта книга устарела. Насколько это правда??
E
22
Здравствуйте! Я вот на stepic решаю задачи на хаскеле https://stepik.org/lesson/8443/step/8?unit=1578 мой код import Data.List (isInfixOf) removing :: String -> [String] ->...
E
10
Камрады, кто тесно работал с vtv, хотел уточнить. Ширина column задаётся жёстко на этапе создания дерева или можно в рантайме ее менять программно (не мышкой)?
Ed Doc
10
да ладно ... что там неочевидного ? глянуть в исх-ки датасета и/или кверика чтобы понять в каком месте и как выполняется обращения к св-вам blablaSQL - минутное дело, даже е...
Сергей
7
Здесь для arm кто-нибудь кодит ?
Nothing
52
Всем привет, у меня есть сервер принимающий входящие HTTP подключения, как проверить, что подключение было через прокси или нет, есть какие то поля в заголовках по которым мо...
DS
8
Карта сайта