Согласно этому коду:
#include <iostream>
using namespace std;
struct T {
T() { cout << "default"<<endl; }
T(string s) { cout << "ctor "<< endl; }
T(const T& t) { cout << "copy ctor"<< endl; }
};
int main()
{
T x = T(T(T()));
return 0;
}
вывод:
default
и согласно стандарту :
(17 ) Семантика инициализаторов следующая. Тип назначения - это тип инициализируемого объекта или ссылки, а исходный тип - это тип выражения инициализатора. Если инициализатор не является одиночным выражением (возможно, заключенным в скобки), тип источника не определен.
.....
(17.6.1) Если выражение инициализатора является prvalue и cv-неквалифицированная версия исходного типа является тем же классом, что и класс назначения, выражение инициализатора используется для инициализации объекта назначения. [Пример: Т х = Т (Т (Т ())); вызывает конструктор по умолчанию T для инициализации x. - конечный пример]
он дает тот же результат в c ++ 11 (GNU G CC v7.1.1)
Первый вопрос: определен ли исходный тип в этот оператор?
T x = T(T(T()));
Теперь, если мы добавим эту функцию к этому коду:
string f(T t) {return "str";}
и заменим T x = T(T(f(T())));
на T x = T(T(T()));
вывод:
default
ctor
теперь определен тип источника?
не T()
выражение инициализатора?
если да Согласно стандарту конструктор по умолчанию должен быть вызван, но почему T(string s)
вызывается для x?