我正在使用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) {
^
答案 0 :(得分:-2)
你应该明白Clang仍然是实验性的(即使它被“广泛使用”),并且基本上建立在GCC之上(通过它有一些重大的变化)你可以确定所有的(谈论C ++代码)是在GCC中编译应该在Clang中编译,如果没有,则是Clang错误。
海湾合作委员会有时间证明其稳健。