clang和gcc中的c++ 14可变模板参数推断
C++14 variadic template argument inference in clang and gcc
我使用的是clang 3.5.0和gcc 4.9.2版本(两者都打开了c++ 14选项,尽管在c++ 11中可以使用尾随返回类型)。
下面的代码可以在g++中编译而不能在clang++中编译。我的问题是"哪个是对的?"
#include <iostream>
#include <tuple>
#include <functional>
using namespace std;
template<typename OP, typename F1, typename... Fs>
struct symop {
OP op;
tuple<F1,Fs...> fs;
symop(const OP &oopp, const F1 &f1, const Fs &...ffss)
: op(oopp), fs(f1,ffss...) {}
};
template<typename OP, typename... Fs>
auto baz(const symop<OP,Fs...> &so) {
return so.op(get<0>(so.fs),get<1>(so.fs));
}
/* // this version compiles on both compilers
template<typename OP, typename F1, typename... Fs>
auto baz(const symop<OP,F1,Fs...> &so) {
return so.op(get<0>(so.fs),get<1>(so.fs));
}
*/
int main() {
symop<plus<int>,int,int> so{plus<int>{},3,4};
cout << baz(so) << endl;
}
叮当声报告
q.cpp:29:10: error: no matching function for call to 'baz'
cout << baz(so) << endl;
^~~
q.cpp:16:6: note: candidate template ignored: couldn't infer template argument
'OP'
auto baz(const symop<OP,Fs...> &so) {
^
您应该了解Clang仍然是实验性的(尽管它被"广泛"使用),并且基本上是基于GCC构建的(尽管它有一些重大的变化),您可以确定在GCC中编译的所有内容(谈论c++代码)都应该在Clang中编译,如果不是,那就是Clang的错误。
相关文章:
- 类模板参数推导-clang和gcc不同
- 带有自动参数的函数使用 GCC 编译,但不使用 Visual C++ 编译
- GCC/CLang不同意模板模板参数的部分特化
- 调试模板时出现问题.专门针对 Linux GCC 7、GCC 6、GCC 5、GCC 4.9 错误构建失败:模板参数 1
- 使用具有默认参数的函数模板进行 decltype 会使结果混乱(一个有趣的问题或 gcc 的错误)
- constexpr 函数的常量引用参数:gcc/msvc vs clang/icc
- 隐蔽的 gcc 参数到 CMake 文件
- typedef名称与可变模板参数名称一致时出现GCC错误
- 将带有模板化方法的类作为带有GCC的模板参数传递
- 在if constexpr中使用带参数包的概念时,升级到gcc 9后出现编译错误
- 模板模板参数导致Clang下的编译器错误,而不是GCC
- GCC 仪器 - 是否可以自动输出函数的参数?
- 带有 gcc 和 clang 的可变参数宏扩展的奇怪行为
- 修改嵌套 lambda 中捕获的参数:gcc 与 clang?
- 使用函数参数作为常量表达式的一部分 - gcc vs clang
- 使用 GCC 5 进行模板参数阴影
- 类数据成员指针的非类型模板参数包无法使用 gcc 编译
- 在 mingw64-gcc 上可能存在可变参数的错误
- 在折叠表达式中扩展参数包作为 lambda 捕获的一部分 - gcc 与 clang
- 打开模板参数:GCC 是否删除开关