2016-10-26 7 views
7

В C++ 11 допускаются неявные преобразования, разрешенные с помощью std :: tie?Разрешены ли неявные преобразования с помощью std :: tie?

Следующий код компилируется и запускается, но я не уверен точно, что происходит за кулисами или если это безопасно.

std::tuple<float,float> foo() { return std::make_tuple(0,0); } 

double a, b; 
std::tie(a,b) = foo(); // a and b are doubles but foo() returns floats 

ответ

14

Что происходит версия шаблона оператора присваивания шаг-кортежа используется

template< class... UTypes > 
tuple& operator=(tuple<UTypes...>&& other); 

, которые шаг присваивает отдельные элементы кортежа, один за другим, используя свои собственные семантики шаг-назначения. Если соответствующие члены неявно конвертируются - они неявно преобразуются.

Это в основном естественное расширение аналогичной функциональности в std::pair, которое мы наслаждаемся уже давно.

+0

Возможно, это хорошая идея отметить, что неявное преобразование происходит внутри тела 'operator =', потому что во время вывода аргумента 'UTypes ...' неявные преобразования игнорируются. – TemplateRex