如果创建了复制构造函数private
then in
Case 1:没有错误,编译器不关心复制构造函数是否在类中定义。
Case 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
}
案例 2 在 N3225 中低于 12.8/31:
如果程序是格式错误的
复制/移动构造函数或复制/移动
对象的赋值运算符是
隐式 odr-used 和特殊
成员函数不可访问。
仅仅因为复制因子被省略并不意味着它没有被 ODR 使用。 3.2/2:
一组候选者中的一个成员
函数是 odr-used 如果是
由重载决策选择时
引用自a
潜在评估的表达。
[注意:这包括对命名的调用
函数 (5.2.2)、运算符
重载(第 13 条)、用户定义
转换 (12.3.2)、分配
新的放置功能(5.3.4),如
以及非默认初始化
(8.5)。复制构造函数或移动
构造函数是 odr 使用的,即使
调用实际上被省略了
执行。 ——尾注]
当然要注意 MSVC 是not完全符合 C++0x,因为 (a) C++0x 还不是标准,并且尚未最终确定; (b) MSVC 还没有实现最新的所有内容。但这个东西与 C++03 相比并没有实质性改变,所以我相当有信心这个解释仍然成立。
情况 1 也会属于这种情况,除了在我检查过的两个 C++03 编译器上它没有达到那么远,因为不可能从字符串文字到 T 的转换。我懒得去检查是否C++0x 中允许任何其他转换序列,任何地方都可能有一个新子句:-)
对我来说,即使有公共复制者,为什么 MSVC 允许情况 1 仍然是个谜。它允许在严格的 C++03 模式下使用吗?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)