我正在尝试创建一个链表模板,它对于用户定义的类型工作正常,但是对于基本类型(如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.2val递归地初始化{args...}:



然后[dcl.init.list]/3.9再次适用。

结论是,此初始化是明确定义的。

07-24 09:45
查看更多