gpt4 book ai didi

c++ - 不调用复制构造函数进行复制初始化或优化?

转载 作者:行者123 更新时间:2023-11-30 00:41:02 25 4
gpt4 key购买 nike

如果复制构造函数是private那么在

情况 1:没有错误,编译器不关心复制构造函数是否在类中定义。

情况 2:错误,复制构造函数是私有(private)的,当它被设置为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:

A program is ill-formed if the copy/move constructor or the copy/move assignment operator for an object is implicitly odr-used and the special member function is not accessible.

仅仅因为复制构造函数被省略并不意味着它没有被 odr 使用。 3.2/2:

A member of a set of candidate functions is odr-used if it is selected by overload resolution when referred to from a potentially-evaluated expression. [Note: this covers calls to named functions (5.2.2), oper- ator overloading (Clause 13), user-defined conversions (12.3.2), allocation function for placement new (5.3.4), as well as non-default initialization (8.5). A copy constructor or move constructor is odr-used even if the call is actually elided by the implementation. —end note ]

当然要注意 MSVC 完全符合 C++0x,因为 (a) C++0x 还不是标准,也没有最终确定;和 (b) 无论如何,MSVC 还没有实现所有最新的东西。但这些东西与 C++03 相比并没有实质性的改变,所以我相当有信心这个解释仍然成立。

案例 1 也属于这种情况,除了在我检查过的两个 C++03 编译器上它没有那么远,因为不可能从字符串文字转换为 T。我不会被打扰检查 C++0x 中是否允许任何额外的转换序列,任何地方都可能有一个新的子句:-)

我仍然是个谜,为什么 MSVC 允许案例 1,即使有一个公共(public)复制 ctor。它是否允许在严格的 C++03 模式下使用?

关于c++ - 不调用复制构造函数进行复制初始化或优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4639576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com