Информация об изменениях

Сообщение Re[3]: Как написать Any с uniform initialization от 28.11.2019 22:08

Изменено 28.11.2019 22:18 rg45

Re[3]: Как написать Any с uniform initialization
Здравствуйте, Molchalnik, Вы писали:

M>Здравствуйте, Igore, Вы писали:


I>>Добавь

I>>
I>>Any( Any& )  {printf("\ncopy2");}
I>>


M>спасибо. поставил плюсик. а почему не происходит best fit на const Any& ? В каком разделе стандарта можно прочитать?


Это особый вид ссылок, известный под котовым названием Forwarding references. Когда ты используешь для конструирования объекта класса lvalue выражение, шаблонный конструктор дает лучшее соответствие типов, чем конструктор копирования, принимающий константную ссылку. Происходит это примерно так: параметр с типом "Тn &&" отображается на тип "Any& &&" (да-да, сразу две ссылки). После этого происходит так называемый коллапсинг избыточных ссылок, по описанному в стандаре правилу, и получается конечный тип формального параметра "Any&". И этот тип лучше подходит для неконстантного объекта, чем "const Any&".
Re[3]: Как написать Any с uniform initialization
Здравствуйте, Molchalnik, Вы писали:

I>>Добавь

I>>
I>>Any( Any& )  {printf("\ncopy2");}
I>>


M>спасибо. поставил плюсик. а почему не происходит best fit на const Any& ? В каком разделе стандарта можно прочитать?


Это особый вид ссылок, известный под кодовым названием Forwarding references. Когда ты используешь для конструирования объекта класса lvalue выражение, шаблонный конструктор дает лучшее соответствие типов, чем котствнтный конструктор копирования. Происходит это примерно так: параметр с типом "Тn &&" отображается на тип "Any& &&" (да-да, ссылка на ссылку). После этого происходит так называемый коллапсинг избыточных ссылок, по описанному в стандарте правилу, и получается конечный тип формального параметра "Any&". И этот тип лучше подходит для неконстантного объекта, чем "const Any&".