为什么`std :: is_const_v`的行为不符合预期?

xml*_*lmx 2 c++ standards const type-traits c++11

#include <iostream>
#include <type_traits>

using namespace std;

template<typename T>
void f(T&&)
{
    cout << boolalpha << std::is_const_v<T> << endl;
    cout << boolalpha << std::is_const_v<T&&> << endl;
}

int main()
{
    const int n = 1;
    f(n);
}
Run Code Online (Sandbox Code Playgroud)

输出是:

false
false
Run Code Online (Sandbox Code Playgroud)

这里n是一个明显的const变量,为什么不std::is_const_v按预期运行?

lll*_*lll 6

std::is_constfalse当所述类型是引用:

cppreference:

如果T是引用类型,则is_const<T>::value始终为false.检查const-ness的潜在引用类型的正确方法是删除引用:is_const<typename remove_reference<T>::type>

在您的特定情况下,T是转发引用,在传递左值参数时将推导为左值引用.这就是为什么你会看到false两个案例.