了解初始化过程
Understanding the process of initialization
这是我试图理解类初始化是如何工作的。我对每件事都不确定,这就是我问这个问题的原因。当我们执行以下操作时,我认为会发生以下情况:
T t = u;
从
u
构造一个类型为T
的对象。这就变成了:T t = T(u);
调用复制构造函数:
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
的构造函数,因此不应该调用相应的构造函数。
我真的想了解一下这个问题。我一直在努力理解这个
对于这种情况有一个特殊的规则。允许编译器跳过复制构造函数,即使它有副作用,只要带有复制构造函数的表达式是合法的。所以
T t = u;
如你所说,等于
T t(T(u));
编译器跳过复制构造函数并将其视为
T t(u);
不允许这样做的一种情况是具有私有复制构造函数的类。在这种情况下,T t(T(u));
将不合法,并且编译器将不允许通过跳过复制构造函数使其合法。
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- 多成员Constexpr结构初始化
- 复制列表初始化的隐式转换的等级是多少
- 内联映射初始化的动态atexit析构函数崩溃
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 是重构过程中结构安全的骨料初始化
- C 在结构初始化过程中带有内部阵列的奇怪错误
- 在构造过程中获取类成员的未初始化引用是否合法
- Opengl 纹理初始化过程
- 在复制初始化过程中不会发生std::string的隐式构造
- 如何在初始化过程中将C中的char转换为int
- 检测CRT初始化是否在注入过程中完成
- 类初始化过程中的内存重叠
- 了解初始化过程
- 在初始化过程中是否存在动态绑定
- 静态指针不会在子类化窗口过程中初始化?
- 在引导过程中,在驱动程序初始化后执行操作