2013-04-08 9 views
14

なぜstd::remove_constconst T&からT&に変換されないのですか?この確かに、むしろ不自然な例私の質問を示しています:コンテキストのために、次のことを想像してstd :: remove_constとconst参照

#include <type_traits> 

int main() 
{ 
    int a = 42; 
    std::remove_const<const int&>::type b(a); 

    // This assertion fails 
    static_assert(
     !std::is_same<decltype(b), const int&>::value, 
     "Why did remove_const not remove const?" 
    ); 

    return 0; 
} 

上記の場合は、修正が自明簡単です:

上記の例で
#include <iostream> 

template <typename T> 
struct Selector 
{ 
    constexpr static const char* value = "default"; 
}; 

template <typename T> 
struct Selector<T&> 
{ 
    constexpr static const char* value = "reference"; 
}; 

template <typename T> 
struct Selector<const T&> 
{ 
    constexpr static const char* value = "constref"; 
}; 

int main() 
{ 
    std::cout 
     << Selector<typename std::remove_const<const int&>::type>::value 
     << std::endl; 

    return 0; 
} 

、私はreferenceを期待表示されるのは、constrefではなくです。

+0

const参照のようなものはありません。constへの参照のみです。 – xaxxon

答えて

13

std::remove_constは、トップレベルconst -qualificationsを削除します。 T const&に相当するconst T&では、修飾はトップレベルではありません。実際、参照自体には適用されません(定義が不変であるため意味がありません)。 std::remove_constに関するC++ 11標準指定の段落20.9.7.1で

表52:

タイプはその 任意トップレベル CONST以外Tと同じタイプに名前を付けなければならないのtypedef部材-qualifierが削除されました。 [remove_const<const int*>::typeconst int*に を評価一方remove_const<const volatile int>::typeは、 volatile intに評価します。 - その後、エンド例]

離れconstを除去するためには、あなたが最初にstd::remove_referenceを適用する必要があり、(必要な場合)、その後std::remove_constを適用し、std::add_lvalue_reference(またはものは何でもあなたのケースで適切である)を適用します。

注:Xeoとしてコメントに言及し、あなたはすなわちconst取り去り、その後、参照を取り去り、最初の2つの手順を実行するためにusing an alias template such as Unqualifiedを考えることができる - (とvolatile-)資格を。

+1

最初の2つは 'Unqualified 'エイリアスの下でグループ化されることがよくあります。 – Xeo

+0

@ Xeo:編集しました、ありがとうございます。 –

+0

ああ、私は今理解しています。説明に感謝します。 :) – dafrito

関連する問題