我正在尝试创建一个链表模板,它对于用户定义的类型工作正常,但是对于基本类型(如gcc和clang的int行为)有所不同。
template<class T>
struct Node {
Node* next;
T val;
};
template<class T, class... Args>
Node<T> create(Args... args) {
return {nullptr, {args...}};
}
int main() {
create<int>(0);
}
当clang编译该代码没有问题时,gcc会生成以下错误消息。
虽然我知道如何解决此问题,但我仍然对clang是否太宽容并且不能依赖于此代码的可移植性感兴趣,还是应该在某个时候解决的gcc错误。
示例:https://godbolt.org/g/9gnvNQ
最佳答案
这是一个GCC错误。
首先,根据[dcl.init.list]/3.9,允许在标量初始化程序(标量类型的列表初始化)周围使用花括号:
其次,Node<int>
是根据[dcl.init.aggr]/1的汇总:
因此,将执行聚合初始化,并根据[dcl.init.aggr]/4.2用val
递归地初始化{args...}
:
然后[dcl.init.list]/3.9再次适用。
结论是,此初始化是明确定义的。