1

似乎要测试 const-ness,必须测试模板参数,但要测试 rvalue-ness,必须测试实际参数。(这是使用 VC++ 2012。)这段代码说明了我的意思:

#include <type_traits>
#include <string>
#include <iostream>

using namespace std;

template<class T>
void f(T& x) {
    cout << "f() is_const<T> and is_const<decltype<x)>" << endl;
    cout << is_const<T>::value << endl; // Prints 1 when arg is const
    cout << is_const<decltype(x)>::value << endl; // Prints 0 when arg is const
}

template<class T>
void g(T&& x) {
    cout << "g() is_const<T> and is_const<decltype<x)>" << endl;
    cout << is_const<T>::value << endl; // Prints 0 when arg is const
    cout << is_const<decltype(x)>::value << endl; // Prints 0 when arg is cons
    cout << "g() is_rvalue_reference<T> and is_rvalue_reverence<decltype(x)>" <<endl;
    cout << is_rvalue_reference<T>::value << endl; // Prints 0 when arg is rvlaue
    cout << is_rvalue_reference<decltype(x)>::value << endl; // Prints 1 when arg is rvalue
}

int main()
{
    const std::string str;
    f(str); // const argument
    cout << endl;
    g(std::string("")); // rvalue argument
    return 0;
} 

我很难理解为什么会这样。有人可以解释一下,或者给我指出一篇解释它的文章吗?如果需要,我将深入研究 C++11 标准。有谁知道相关的部分吗?

4

1 回答 1

5

原因是你误解了一些事情。x永远不会出现const在任何这些示例中,仅仅是因为没有const引用类型(无论如何您都无法更改引用所指的内容)。在is_const<T>您基本上忽略了您声明xT&.

rvalue ref 测试也存在类似的误解。Tin (T&&称为通用引用,顺便说一句)将U&在您传递左值和U传递右值时推导出来。测试时is_rvalue_reference<T>,您再次忽略了您声明xT&&. 在测试时is_const<T>,您没有考虑T将成为参考的事实,如上所述,它永远不会是const

正确的测试g

  • std::is_const<typename std::remove_reference<T>::type>::value
  • std::is_rvalue_reference<T&&>::value
于 2012-10-07T22:53:49.107 回答