以下代码在 Visual C++ 2013 中编译良好,但在 GCC 或 Clang 下编译失败。
哪个是正确的?
通过隐式转换返回对象时是否需要可访问的复制构造函数?
class Noncopyable
{
Noncopyable(Noncopyable const &);
public:
Noncopyable(int = 0) { }
};
Noncopyable foo() { return 0; }
int main()
{
foo();
return 0;
}
海合会:
error: 'Noncopyable::Noncopyable(const Noncopyable&)' is private
Noncopyable(Noncopyable const &);
^
error: within this context
Noncopyable foo() { return 0; }
clang :
error: calling a private constructor of class 'Noncopyable'
Noncopyable foo() { return 0; }
^
note: implicitly declared private here
Noncopyable(Noncopyable const &);
^
warning: C++98 requires an accessible copy constructor for class 'Noncopyable' when binding a reference to a temporary; was private [-Wbind-to-temporary-copy]
Noncopyable foo() { return 0; }
^
note: implicitly declared private here
Noncopyable(Noncopyable const &);
^
最佳答案
当您 return
一个表达式时,会创建一个返回类型的临时对象,使用该表达式进行初始化,然后将其移动(或复制,如果不能选择移动)到返回值中.所以你需要一个可访问的复制或移动构造函数。
但是,可以使用花括号列表直接初始化返回值。所以以下工作:
Noncopyable foo() { return {0}; }
live example 中的类似情况.
关于c++ - 通过隐式转换返回时是否需要复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24238786/