は例を考えてみましょう:クラステンプレートの引数を自由に控除した関数スタイルキャスト式を自由に使用できますか?
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.
'operator +'はこれらの質問には関係ありません(#1と#4に焦点を当てています)。MVCEを '構造タグ{tag(T){}};テンプレート' W.r.t. #1と#3の間で、clangはそれを受け入れない(それを含むと引数リストを受け入れる)のが奇妙に思えることに同意し、 'タグ'のctorsの自動減算ガイドがどのように適用されるか。 –
dfri
@dfri最小限の、良い点、ありがとう! –