使用显式构造函数返回不可复制的不可移动对象

时间:2017-02-22 12:48:08

标签: c++ c++11

如果我们有一个带有非显式构造函数的不可移动的非可复制类,我们可以返回它并使用如下(在C ++ 11中):

#include <iostream>
class NonCop
{
public:
    /*non explicit*/ NonCop(int a, int b) : number(a + b) {}
    NonCop(const NonCop&) = delete;
    int number;
};

NonCop get_non_cop()
{
    return {1, 2};
}

int main()
{
    NonCop &&nc = get_non_cop();
    std::cout << "three: " << nc.number << std::endl;
    return 0;
}

但是,如果构造函数是显式的,则它不起作用。有没有在C ++ 11 / C ++ 14中执行此操作的方法,而NonCop没有修改?

目前我正在使用从NonCop派生的解决方法,使用“deexplicits”构造函数的包装器,但它看起来不太漂亮。

1 个答案:

答案 0 :(得分:2)

不幸的是,在此上下文中,您无法返回临时对象,因为在返回值表达式时,编译器要求可以访问对象的复制构造函数,即使此对象将要复制最终被淘汰了。但是,您可以返回std::unique_ptr而不是具体对象。

std::unique_ptr<NonCop> get_non_cop() {
    return std::make_unique<NonCop>(1, 2);
}

Live Demo