模板中的C++ rvalue临时值

Any*_*orn 8 c++ templates rvalue

能否请您解释一下以下机制的区别:

int function();

template<class T>
void function2(T&);

void main() {
    function2(function()); // compiler error, instantiated as int &

    const int& v = function();
    function2(v); // okay, instantiated as const int&
}
Run Code Online (Sandbox Code Playgroud)

我的推理在实例化方面是正确的吗?为什么不首先实例化为const T&

谢谢

Joh*_*itb 3

因为function返回一个非常量值。只有对象可以是 const,因为它们存储一些状态,如果不是 const,则可以对其进行修改。你返回的不是一个对象,而是一个纯值。从概念上讲,它们是不可修改的(例如,像枚举常量),但它们不是 const 限定的(又像枚举常量)。

  • @aca更准确地说,[非类右值总是具有cv-unqualified类型](http://stackoverflow.com/questions/2169932/non-class-rvalues-always-have-cv-unqualified-types);- )对于类类型,可修改的右值和 const 右值之间存在区别,因此一般来说,“const”*不是*多余的!您可以对可修改的右值调用非常量方法,从而更改底层对象。例如,`std::string("hello ").append("world!")`。 (2认同)