私は過去数日間のテンプレート変換演算子タイプの控除に関するコンパイラ間の違いに取り組んできました。スタックオーバーフローサイズ例:テンプレート化された変換演算子のタイプの差異はclangとgccで異なります
void foo(int i);
struct any_const_reference {
template <typename T>
operator const T&();
};
template <typename T, typename Enable=void>
struct detect_call : std::false_type { };
template <typename T>
struct detect_call<T,
decltype(declval<T>()(any_const_reference()))
> : std::true_type { };
を表現detect_call<decltype(foo)>::value
、私が上で私の手を得ることができるコンパイラのいずれかのいずれかの現代版を使用して(gccの中で最新のビーイングのGCCを打ち鳴らすとfalse
でtrue
を与えます5.2およびclang 3.8)。質問:
- どちらが正しいですか?つまり、C++標準に準拠していますか?
- この違いの原因は何ですか?
- 一般的に、変換演算子(またはこのフォームの変換演算子、たとえば
template <typename T> operator T();
)のT
に適用される型減算ルールは何ですか?それらはC++標準のどこにありますか?
注:これは、この質問に似ているようだ:Template argument type deduction by conversion operator(確かに、私もその正確な違いに遭遇しました)が、私はかなりその答えと、このケースとの間のマッピングが表示されません。これがこの問題のもう一つの例である場合、この問題は、この問題をこのユースケースにどのようにマッピングするかまでです。
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63217のように見えます。 –
あなたはあなたのコードに完全な例を入れて、あなたがテストしているgccとclangのバージョンと、このバグを見つけた他の人が見つけやすくするために? – xaxxon
@ xaxxon完全な例はデモリンクにありますが、基本的に#includeとmainには与えられた式を呼び出しています。後継のためにコンパイラのバージョンを追加しました –