2017-11-09 7 views
2

は例を考えてみましょう:クラステンプレートの引数を自由に控除した関数スタイルキャスト式を自由に使用できますか?

template <class T> 
struct tag { 
    tag(T) {} 
}; 

int main() { 
       tag(int{});  //#1 
    auto t1 = tag(int{});  //#2 
    auto t3 = (tag(int{})); //#3 
} 

tagは、クラステンプレート引数の控除に関与すべき自動控除ガイドを持っています。少なくとも私はそれが#1と#3が予期せぬことにちょっと行動しなければならないと思った。[clang]。一方、すべては[gcc]で正常にコンパイルされます。だから問題は、私は自由に関数スタイルのキャスト式でクラステンプレート引数の控除を使用することができますか、問題には何か制限がありますか?

打ち鳴らすのエラーリストは:

prog.cc:7:19: error: expected unqualified-id 
       tag(int{});  //#1 
       ^
prog.cc:7:19: error: expected ')' 
prog.cc:7:18: note: to match this '(' 
       tag(int{});  //#1 
       ^
prog.cc:9:23: error: expected ')' 
    auto t3 = (tag(int{})); //#3 
        ^
prog.cc:9:19: note: to match this '(' 
    auto t3 = (tag(int{})); //#3 
       ^
prog.cc:9:27: error: expected expression 
    auto t3 = (tag(int{})); //#3 
         ^
4 errors generated. 
+1

'operator +'はこれらの質問には関係ありません(#1と#4に焦点を当てています)。MVCEを '構造タグ{tag(T){}};テンプレート' W.r.t. #1と#3の間で、clangはそれを受け入れない(それを含むと引数リストを受け入れる)のが奇妙に思えることに同意し、 'タグ'のctorsの自動減算ガイドがどのように適用されるか。 – dfri

+0

@dfri最小限の、良い点、ありがとう! –

答えて

1

これは、#34091既知のバグです。基本的には、clangはテンプレートIDを取得する予定はありません。それは最終的に固定されます(ただし、5.0.1では恐れません)。

あなたの質問に答えるために、はい、gccは完全に正しいです。クラステンプレートの控除が2つの単純なケースではうまくいかないとすれば、私は実際に標準化委員会に怒っているでしょう。 :P

+1

少なくとも私はバグレポートを提出する必要はありません;) –

関連する問題