web-dev-qa-db-ja.com

std :: make_pairがペアを返さないのはなぜですか?それとも?

内部の健全性チェックに失敗したため、Stackoverflowで再実行しています。

次のコード:

#include <iostream>
#include <typeinfo>
#include <utility>

int main()
{
    constexpr auto pair_of_ints = std::make_pair(1, 2);
    std::cerr << typeid(pair_of_ints).name();
    //static_assert(std::is_same<decltype(pair_of_ints), std::pair<int, int>>::value, "WTF");
}

私のシステム(XCode Clang 8.x)でstd::__1::pair<int, int>のマングルシンボル名を生成します。

次にstatic_assertを有効にすると失敗します。なぜか分かりません。どうすればこれを機能させることができますか?渡された引数に応じてペアまたはタプルを返す関数があり、正しいケースで実際にペアまたはタプルを返すことを確認したいと思います。

20
rubenvb

pair_of_intsconstexprとして宣言しましたが、これはconstを意味します:

[dcl.constexpr]#9

オブジェクト宣言で使用されるconstexpr指定子は、オブジェクトをconstとして宣言します。

したがって、pair_of_intsのタイプは実際には次のとおりです。

const std::pair<int, int>

typeidはcv-qualifiersを無視します。そのため、この情報は名前に表示されません。

[expr.typeid]#5

式のタイプまたはtype-idがcv修飾型の場合、typeid式の結果はstd::type_infoを参照しますcv非修飾型を表すオブジェクト。

Const-qualified型に対してテストするか、 std :: remove_const_t を使用してconst-qualifierを削除できます。

static_assert(std::is_same<decltype(pair_of_ints), 
                           const std::pair<int, int>>::value);
static_assert(std::is_same<std::remove_const_t<decltype(pair_of_ints)>, 
                           std::pair<int, int>>::value);
38
Holt