对于临时对象,在Clang 6中似乎打破了模板参数推断。
g ++ 8.1.0正确编译并运行示例。
Clang 6.0.0和6.0.2在指示的行上都出现此错误消息:
error: expected unqualified-id
Print{1,"foo"s,2}; /********** Broken in Clang **********/
所有其他行正常工作。
无论是使用-std=c++17
还是-std=c++2a
,行为都是相同的。
The Clang c++ Status Page表示模板参数推断是从Clang 5(P0091R3,P0512R0)开始实现的。
这是一个错误吗?是否有解决方法(例如编译器标志,不是代码更改)?
示例:
template<class ...Ts>
void print(Ts...ts){ (( cout << ... << ts )); }
template<class ...Ts>
struct Print {
Print(Ts...ts){ (( cout << ... << ts )); }
};
int main(){
Print{1,"foo"s,2}; /********** Broken in Clang **********/
Print<int,string,int>{1,"foo"s,2};
auto p1 = Print{1,"foo"s,2};
Print p2{1,"foo"s,2};
print(1,"foo"s,2);
}
答案 0 :(得分:8)
这是Clang bug 34091。
幸运的是,它已经修复,并且是Clang compiles this without issue的主干构建。
据我所知,目前没有办法在没有代码更改的情况下解决这个问题,而不管是什么时候升级到下一个Clang版本。