c++ - 通过隐式转换返回时是否需要复制构造函数?

标签 c++ copy-constructor implicit-conversion copy-elision

以下代码在 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/

相关文章:

c++ - 事件监听器如何工作?

c++ - 我的第二次 C++ 尝试和使用变量的问题

c++ - 如何使用 std::accumulate 和 lambda 计算平均值?

c++ - 如何构建使用 OpenCV 的 XCode 6 iOS 应用程序 - 未定义错误 __cplusplus

c++ - 我应该删除内部创建线程的类的复制构造函数和赋值运算符吗?

c++ - 奇怪的复制构造函数

c - С 条件下的类型转换

c# - 是否可以在 C# 中为可空值和不可空值编写隐式转换运算符?

c++ - 向控制台打印时间函数产生 1

c++ - 转换构造函数