这是我的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默认编译器。
感谢。
答案 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
“。 - 结束示例]