clang和gcc中的c++ 14可变模板参数推断

C++14 variadic template argument inference in clang and gcc

本文关键字:参数 gcc 中的 c++ clang      更新时间:2023-10-16

我使用的是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的错误。