从通用引用推导类型时为什么忽略const?

时间:2016-11-12 22:04:59

标签: c++ templates perfect-forwarding type-deduction

这是我的A类的定义,并为它创建函数:

template< typename T >
class A
{
public:
    A( T test )
    : _test( test )
    {}

public:
    const T _test;
};

template <typename T>
A<T> make_a (T&& elem) {
    return A<T>{std::forward<T>(elem)};
}

当我将int左值传递给make_a函数时,我希望实例化的类类似于

class B
{
public:
    B( int &test )
    : _test( test )
    {}

public:
    const int &_test;
};

A::_test的类型推断为int&而不是const int&

int main(int argc, const char * argv[]) {

    int a = 1;
    auto aa = make_a(a);
    aa._test = 2; // compiled OK

    B bb(a);
    bb._test = 2; // compilation error
    return 0;
}

有人可以解释一下导致这种行为的原因吗?

我正在使用XCode 7.0,LLVM 7.0默认编译器。

感谢。

1 个答案:

答案 0 :(得分:1)

此行为是由语言标准引起的。

  

N4140§8.3.2[dcl.ref] / 1

     

除非通过使用 typedef-name (7.1.3,14.1)引入cv限定符,否则Cv限定引用的格式不正确    decltype-specifier (7.1.6.2),在这种情况下,忽略cv限定符。 [例如:

typedef int& A;
const A aref = 3; // ill-formed; lvalue reference to non-const initialized with rvalue
     

aref的类型是“对int的左值引用”,而非“左值”   引用const int“。 - 结束示例]