【发布时间】:2014-08-05 23:43:36
【问题描述】:
以下代码在 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; }
叮当声:
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 &);
^
【问题讨论】:
-
很好的问题,但是默认情况下,我投票支持 gcc/clang 作为 C++ 的真正实现,而不是 MSVC。
-
@MM.: 谢谢 :) 是的,这通常是真的。在这种情况下,我觉得说不需要复制构造函数是有道理的,这主要是我问的原因。没有任何明显需要复制的对象(即使没有复制省略)。
-
@DarioP 这看起来像是一个不同的问题。
标签: c++ copy-constructor implicit-conversion copy-elision