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

时间:2015-06-03 18:11:11

标签: c++ c++11 gcc c++14 clang++

我正在使用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;
}

Clang报道

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) {
     ^

1 个答案:

答案 0 :(得分:-2)

你应该明白Clang仍然是实验性的(即使它被“广泛使用”),并且基本上建立在GCC之上(通过它有一些重大的变化)你可以确定所有的(谈论C ++代码)是在GCC中编译应该在Clang中编译,如果没有,则是Clang错误。

海湾合作委员会有时间证明其稳健。