考虑一个例子:
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] 中的一切都编译得很好。 。所以问题是我可以在函数样式转换表达式中自由地使用类模板参数的推导吗?或者有什么限制吗?
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 是完全正确的。如果类模板参数推导不适用于这两个简单的情况,我真的会对标准委员会感到愤怒。 :P
关于c++ - 可以自由地使用涉及类模板参数推导的函数样式转换表达式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47197957/