可以自由使用涉及 class 模板参数推导的函数样式转换表达式吗?
Can one use function style-cast expressions involving deduction of class template argument(s) freely?
考虑一个例子:
template <class T>
struct tag {
tag(T) {}
};
int main() {
tag(int{}); //#1
auto t1 = tag(int{}); //#2
auto t3 = (tag(int{})); //#3
}
tag
有一个自动推导指南,应该参与推导 class 模板参数。至少我认为它应该作为 #1 和 #3 在 [clang]. On the other hand everything compiles fine in [gcc] 中表现得有点出乎意料。所以问题是我可以在函数样式转换表达式中自由使用 class 模板参数的推导,还是有任何限制?
clang错误列表:
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.
这是一个已知错误,#34091。基本上,clang 不希望在那里获得 template-id。它最终会得到修复(但恐怕不是在 5.0.1 中)。
回答你的问题,是的,gcc 是完全正确的。如果 class 模板参数推导不适用于这两个简单的情况,我真的会对标准委员会感到愤怒。 :P
考虑一个例子:
template <class T>
struct tag {
tag(T) {}
};
int main() {
tag(int{}); //#1
auto t1 = tag(int{}); //#2
auto t3 = (tag(int{})); //#3
}
tag
有一个自动推导指南,应该参与推导 class 模板参数。至少我认为它应该作为 #1 和 #3 在 [clang]. On the other hand everything compiles fine in [gcc] 中表现得有点出乎意料。所以问题是我可以在函数样式转换表达式中自由使用 class 模板参数的推导,还是有任何限制?
clang错误列表:
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.
这是一个已知错误,#34091。基本上,clang 不希望在那里获得 template-id。它最终会得到修复(但恐怕不是在 5.0.1 中)。
回答你的问题,是的,gcc 是完全正确的。如果 class 模板参数推导不适用于这两个简单的情况,我真的会对标准委员会感到愤怒。 :P