了解模板中的const

时间:2019-03-10 15:51:57

标签: c++ templates const

如果您编写这样的模板

template <typename T>
using X = const T;

const T是什么意思?

要知道这一点,我编写了以下程序:

std::cout << std::boolalpha
    << std::is_same_v<X<int&>, int&> << '\n'
    << std::is_same_v<X<const int*>, const int* const> << '\n'
    << std::is_same_v<X<const int&>, const int&> << '\n';

令我惊讶的是,所有答案都是正确的。

为什么X 是int&而不是'const int&'?

我用gcc 7.3.0和clang ++ 6.0编译了它。答案相同。

2 个答案:

答案 0 :(得分:4)

引用const int是一回事。 const引用int是胡说八道。

根据C ++的规则,当您const限定引用时,什么也没发生。

如果您习惯使用const东部语言,这很有意义,如果您是使用const西部语言的用户,则没有什么意义。

int const&

是对const int的引用。

int&const

相同
int&

答案 1 :(得分:1)

  

Cv限定的引用格式错误,除非通过使用typedef-name[dcl.typedef][temp.param])或decltype-specifier({ {3}}),在这种情况下,cv限定词将被忽略。 [示例:

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

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

[dcl.type.simple]