1

我知道这没关系:

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-ness),并使第二种情况合法。

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

4

1 回答 1

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
};
于 2013-08-10T13:18:09.920 回答