2017-02-16 6 views
1

В DR 2137 мы следующий тексте (курсив мой):DR 2137 не ясно мне

Не ясно, в коде, как следующее, что при выборе копии/переместить конструктора является правильным выбором когда список инициализатор содержит один элемент типа инициализации, в соответствии с требованиями выпуска 1467:

#include <initializer_list> 
#include <iostream> 

struct Q { 
    Q() { std::cout << "default\n"; } 
    Q(Q const&) { std::cout << "copy\n"; } 
    Q(Q&&) { std::cout << "move\n"; } 
    Q(std::initializer_list<Q>) { std::cout << "initializer list\n"; } 
}; 

int main() { 
    Q x = Q { Q() }; 
} 

Здесь цель в том, что Q объекты могут содержать другие Q объектов, , но это нарушается решением проблемы 1467.

Я хотел бы понять, почему приведенный выше код будет нарушен разрешением issue 1467.

+4

Ну, проблема заключается в том, следует ли 'Q {Q()};' вызывать 'Q (Q &&)' или 'Q (std :: initializer_list )'. DR1467 заставляет его вызывать 'Q (Q &&)', а DR2137 предлагает, чтобы он вызывал 'Q (std :: initializer_list )'. Отвечает ли это на ваш вопрос? (если нет, то, возможно, обратитесь к более подробным сведениям о вашем вопросе) –

+0

@ M.M Это явно отвечает на мой вопрос. Но почему решение, данное 2137 лучше, чем 1467? Если вы предпочитаете, заполните ответ на вопрос, чтобы я мог закрыть поток. Благодарю. –

+0

Я не мог сказать, почему один лучше другого –

ответ

1

DR 2147 имеет следующее утверждение: «Цель состоит в том, что Q объектов могут содержать другие Q объектов». Учитывая это, он предполагает, что если пользователь создает Q из списка с привязкой-инициализацией, содержащего другие Q, то целью пользователя является вызов конструктора initializer_list.

Учитывая это предположение, он «сломан» до не вызывает конструктор initializer_list, который может вызвать 1467.

Согласны ли вы с этой логикой или нет, это мышление за 2147. Это также мышление, позволяющее [over.match.list] определять приоритеты для конструкторов initializer_list по любому другому типу конструктора. Таким образом, это согласовано.

 Смежные вопросы

  • Нет связанных вопросов^_^