Во первых это copy/move конструктор
а во вторых copy elision?
Это просто вызов конструктора. Такой есть в примерах стандарта [Note 1: Because constructors do not have names, they are never found during unqualified name lookup; however an explicit type conversion using the functional notation ([expr.type.conv]) will cause a constructor to be called to initialize an object. The syntax looks like an explicit call of the constructor. — end note] [Example 2: complex zz = complex(1,2.3);
Нет
можете сами пробежаться по началам пунктов в списках, чтобы понять, что copy elision тут никаком боком http://eel.is/c++draft/class.copy.elision#1 http://eel.is/c++draft/class.copy.elision#3
вообще компилятор на это двояко смотрит
@dpaukaev кстати http://eel.is/c++draft/dcl.init#general-16.6.1
https://godbolt.org/z/bqrTMnc6x не понятно чем ему мув конструктор тогда мешает)
по моему там вполне понятное сообщение об ошибке.
этот код успешно компилируется в режиме С++17 и новее этот пункт (dcl.init#general-16.6.1) приехал вместе с прочими формулировками copy elision в [p0135] я согласен, что концептуально в S s = S() опускается лишний вызов оператора перемещения, и таково было намерение автора бумаги, но с точки зрения стандарта copy elision это вполне конкретное явление, разрешенное в закрытом перечне контекстов, и рассматриваемый случай в них не входит
P0135R0: Guaranteed copy elision through simplified value categories (by Richard Smith) (2015-09-27) P0135R1: Wording for guaranteed copy elision through simplified value categories (by Richard Smith) (2016-06-20)
в чем оно понятное?
ага, видимо так
Стандарты имеют свойство изменяться :)
Если отключить copy-ellision, то там будет вызов мув конструктора https://godbolt.org/z/4sK71fsde
можно подробней? перечитал cppref , там все сводится к вызову конструктора, который сведется к copy elision
А нечего подробнее
я подробнее приводил ссылку на годболт. да, это copy elision
концептуально это он, но по стандарту copy elision как термин это примерно return value optimization, и приведенный пример под это не очень подходит https://t.me/supapro/1016714
Можно это ещё показать без -fno-copy-elision: если удалить copy/move конструкторы, то T t = T(); перестанет компилироваться
в эту опцию компилятора вложен такой смысл, какой захотели разработчики компилятора. оно не обязано коррелировать со значением copy elision, которым пользуется стандарт
На с++17 и с этим флагом не будет никаких мувов
а на с++14 будет
У некоторых копиляторов будет. У icc и на С++11 нет никакого мува
и оно так не потому, что эта форма записи поменяла сущность, а потому что появился guaranteed copy elision и move конструктор уже не нужен из-за этого
Обсуждают сегодня