1

const-nessをテストするには、template-parameterをテストする必要がありますが、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れることはありません(とにかく参照が参照するものを変更することはできません)。あなたは基本的にあなたがとして宣言したことを無視しています。constconstis_const<T>xT&

同様の誤解が右辺値参照テストでも機能しています。Tin (ユニバーサル参照と呼ばれます、ところで)は、左辺値を渡すときと右辺値を渡すときのT&&ように推定されます。テストするとき、あなたはあなたがとして宣言したことを再び無視しています。テストするとき、参照になるという事実を考慮していませんでした。これは、上記のように、決して参照することはできません。U&Uis_rvalue_reference<T>xT&&is_const<T>Tconst

の正しいテストg

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