可以自由使用涉及 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