内部の健全性チェックに失敗したため、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
を有効にすると失敗します。なぜか分かりません。どうすればこれを機能させることができますか?渡された引数に応じてペアまたはタプルを返す関数があり、正しいケースで実際にペアまたはタプルを返すことを確認したいと思います。
pair_of_ints
をconstexpr
として宣言しましたが、これはconst
を意味します:
オブジェクト宣言で使用される
constexpr
指定子は、オブジェクトをconst
として宣言します。
したがって、pair_of_ints
のタイプは実際には次のとおりです。
const std::pair<int, int>
typeid
はcv-qualifiersを無視します。そのため、この情報は名前に表示されません。
式のタイプまたは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);