c++ - 可以自由地使用涉及类模板参数推导的函数样式转换表达式吗?

标签 c++ templates language-lawyer c++17 template-argument-deduction

考虑一个例子:

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/

相关文章:

c++ - 子对话框 - SetWindowTextA 或 SendMessageA 使程序崩溃 - MFC

Python 扩展在处理大型列表时创建无效指针

c++ - 为什么这个 fwrite 写的是垃圾?

c++ - std::memcpy 是否确定其目的地?

c++ - 是否有任何工具可以显示函数内的数据依赖性

javascript - 用于将迭代值(例如数组元素)插入 HTML 的简单 JavaScript 模板文字

c++ - std::bind 和可变参数模板函数

c++ - 模板重载(不同。参数数量)

c - 在编译时和运行时保证 ASCII 的最佳方法是什么?

c++ - Clang 和 GCC 在强制转换 C++17 中的非类型模板参数的自动说明符中存在分歧