2016-10-04 32 views
2

有没有办法将一个常量引用指定为不绑定临时对象的参数类型(函数的)? 也就是说,是否有一种标准的方式来指定引用是const,但它只能绑定到非临时值,试图绑定到临时导致编译器错误¹?指定一个不会绑定临时对象的const int&`


例如,在一类X的构造的情况下,

class X 
{ 
public: 
    X(const int &value) 
     : mValue(value) 
    {} 

private: 
    const int &mValue; 
}; 

这将是一个很好的方法,以确保

class Y 
{ 
public: 

    /* ... */ 

    X* GetXForValue() const 
    { 
     return new X(mValue); 
    } 

private: 
    int mValue; 
}; 

编译,但与所谓的一个临时的,例如X x(100);,它不?


¹)我可以重载函数int&&并没有定义它,但会给出错误的想法,只会导致链接错误。

+3

你可以'X(const int && value)= delete;'而不是定义导致链接器错误的函数 –

+0

@PiotrSkotnicki我认为只有默认构造函数可以被标记为已删除? – MicroVirus

+0

@MicroVirus *任何*功能都可以标记为已删除。 – Rakete1111

回答

9

的一般解决方案是添加已删除过载:

void foo(const int&); 

void foo(const int&&) = delete; 

后者对于右值更好的匹配,从而不希望的程序将选择删除过载,成为形成不良。

+2

它是否必须是'const'在const int &&中?这是没有必要的,对吧? – Rakete1111

+2

@ Rakete1111:呃。这取决于。对于内置类型,如果你只*想禁止prvalues,那么你不需要限定,因为内置的prvalues永远不合格。但用户定义的类型可能是合格的,并且OP也要求rvalues,而不是prvalues,并且xvalues当然可以被限定。 –

+5

Builtin * xvalues *可以被限定,所以如果你想禁止rvalues,那么即使对于int也是很重要的。 –

相关问题