强制返回的const值移动而不是复制

时间:2013-08-10 12:48:09

标签: c++ c++11 move-semantics

我知道这没关系:

struct Foo {
    Foo& operator=( Foo& ) = delete; // disallow assign
    Foo( int ) { }                   // some basic constructor
    Foo( const Foo& ) = delete;      // disallow copy
    Foo( Foo&& ) { }                 // allow move
};

Foo getFoo( void ) {
    return Foo( 3 );
}
Foo foo = getFoo( ); // uses move constructor

虽然这将使用复制构造函数,因此对Foo无效(对于任何带有复制构造函数的对象,它将有效但效率低下):

const Foo getConstFoo( void ) {
    return Foo( 3 );
}
const Foo constFoo = getConstFoo( ); // error: copy constructor is deleted!

但这没关系:(并将延长constFooRef

的寿命
const Foo& constFooRef = getConstFoo( ); // uses move constructor

现在,第二种情况将调用

Foo( const Foo&& ) { }

如果有的话。所以我想知道是否有任何方法可以从该构造函数中检测到最终对象是const。如果有,我可以应用移动语义(因为两个涉及的对象都是const,并且参数没有在别处使用,可以抛弃常量),并使第二种情况合法。

因此,当我的问题标题解释了我想要实现的最终结果时,我的子问题是检测一个对象在构造之后是否是const(天真地我尝试Foo( const Foo&& ) const { },但没有运气有!)

1 个答案:

答案 0 :(得分:0)

你可以做

Foo::Constant getConstFoo( void ) {
    return Foo::Constant( 3 );
}

其中Foo :: Constant是不可变的

struct Foo {
    struct Constant
    {
       Constant(Foo&&);
    };
    Foo& operator=( Foo& ) = delete; // disallow assign
    Foo( int ) { }                   // some basic constructor
    Foo( const Foo& ) = delete;      // disallow copy
    // You might not use: Foo( Foo&& ) { }                 // allow move
};