显式复制构造函数调用语法
Explicit Copy constructor call syntax
当我将我的复制构造函数声明为显式时,使用 = 而不是 () 调用它不会编译。这是我的代码:
class Base
{
public:
explicit Base(){cout<<__PRETTY_FUNCTION__<<endl;}
explicit Base(Base& b){cout <<__PRETTY_FUNCTION__<<endl;}
};
int main()
{
Base a;
Base b=a;
}
编译器说:
错误:调用"Base::Base(Base&)"没有匹配函数
如果我将其更改为
Base b(a);
它编译得很好。我认为C++认为这两种实例化风格相同。如果我删除显式关键字,它确实可以双向工作。我猜当我使用 = 时会发生一些隐式转换。那么我在这里错过了什么?
不,它们不一样。C++ 标准部分 § 12.3.1 [class.conv.ctor]
显式构造函数像非显式构造函数一样构造对象 构造函数,但仅在直接初始化语法的情况下执行此操作 (8.5) 或显式使用强制转换 (5.2.9、5.4) 的地方
Base b(a); // Direct initialization
Base b=a; // Copy initialization
复制初始化(使用 =
)不考虑显式构造函数,但直接初始化(使用 ()
)可以。
复制初始化,则必须使用强制转换或使构造函数不显式。
相关文章:
- 函数调用中参数的顺序重要吗
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 变量没有改变?通过向量的函数调用
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 模板函数调用
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 使用基类指针调用基类的值构造函数的语法是什么?
- 需要"模板<>"语法 --> 通过函数调用类模板
- 压缩C++函数调用语法
- P/调用语法 - 我是否在 C# 中正确翻译了我的C++函数
- 在构造函数成员初始化之前调用成员函数的语法
- 奇怪的类似函数调用的语法
- 如何用C++兼容的语法转换C函数调用
- 显式复制构造函数调用语法
- 统一的调用语法和函数指针
- 线程函数未被调用.语法有什么问题吗
- 函数调用语法
- 奇怪的c++语法:函数调用之前的类型定义