cpx*_*cpx 1 c++ visual-c++-2010
如果是复制构造函数,private那么
情况1:没有错误,编译器不关心是否在类中定义了复制构造函数.
情况2:错误,复制构造函数是私有的,当它被创建时public,它被省略.
它是否直接优化了副本而没有注意到构造函数是否已经构建private?
#include <string>
using std::string;
class T
{
string s;
T(const T &obj):s(obj.s){}
public:
T(const string &str):s(str){}
};
int main()
{
T a = ("Copy Initialization"); //Case: 1
T b = T("Copy Initialization"); //Case: 2
}
Run Code Online (Sandbox Code Playgroud)
案例2在N3225中低于12.8/31:
如果对象的复制/移动构造函数或复制/移动赋值运算符被隐式使用并且无法访问特殊成员函数,则程序格式不正确.
仅仅因为复制文件被删除并不意味着它没有被使用.3.2/2:
如果从可能评估的表达式引用时通过重载决策选择了一组候选函数的成员,则使用该函数.[注意:这包括对命名函数(5.2.2)的调用,操作符重载(第13条),用户定义的转换(12.3.2),新的放置的分配函数(5.3.4),以及非默认初始化(8.5).即使调用实际上被实现省略,复制构造函数或移动构造函数也会被使用. - 尾注]
当然要注意MSVC 不完全符合C++ 0x,因为(a)C++ 0x还不是标准,并且没有最终确定; (b)MSVC无论如何都没有实现最新的一切.但是这个东西并没有从C++ 03大幅改变,所以我相当自信解释仍然存在.
案例1也属于这个,除了在两个C++ 03编译器上我已经检查过它没有那么远,因为没有可能从字符串文字转换为T.我不能打扰检查是否C++ 0x中允许有任何额外的转换序列,在任何地方都可能有新的子句:-)
对我来说,为什么MSVC允许案例1,即使是公共副本ctor,这仍然是一个谜.它是否允许它在严格的C++ 03模式下?