这是我尝试理解类初始化的工作原理。我不确定所有事情,这就是我问这个问题的原因。这是我认为在我们执行以下操作时会发生的情况:
T t = u;
从T
构造一个u
类型的对象。然后变成:
T t = T(u);
调用copy-constructor:
T t( T(u) );
好的第二个是我不理解的部分。我读到T t = u
被T t(T(u))
制作的地方。但如果这是真的,为什么不打印“copy-constructor”:
struct T
{
template <class U>
T(U) {
std::cout << "constructs an object of type T...\n";
}
T(T const &)
{
std::cout << "copy-constructor";
}
T& operator=(T const &)
{
std::cout << "assignment operator"; return *this;
}
T() = default;
};
int main()
{
T t(T(5));
}
实际上,这一切都是打印“构造一个T型对象”。为什么复制构造函数不在此处调用?可以将T(5)
转换为T const &
类型的对象,该对象将传递给T
的构造函数,因此不应调用相应的构造函数。
我真的很喜欢这方面的一些见解。我一直试图理解这一点。
答案 0 :(得分:4)
这种情况有一个特殊的规则。允许编译器跳过复制构造函数,即使它有副作用,只要复制构造函数的表达式合法。所以
T t = u;
正如你所说,相当于
T t(T(u));
编译器跳过复制构造函数并将其视为
T t(u);
不允许这种情况的一种情况是具有私有拷贝构造函数的类。在这种情况下,T t(T(u));
将不合法,并且不允许编译器通过跳过复制构造函数使其合法。