【发布时间】:2018-07-13 23:49:30
【问题描述】:
我正在尝试创建一个链表模板,它适用于用户定义的类型,但对于 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 会生成以下错误消息。
错误:无法将“{nullptr, {args#0}}”从“
”转换为“Node ”
虽然我知道如何解决这个问题,但我仍然感兴趣的是 clang 是否过于宽松,我不能依赖此代码的可移植性,或者它是一个 gcc 错误,应该在某个时候解决。
【问题讨论】:
-
移除大括号
{args...}解决了 GCC 和 Clang的问题。 -
成功了:
return {nullptr, args... }; -
如果我移除大括号,那么我将无法使用用户定义的构造函数来处理结构。 (godbolt.org/g/32ZR6K) 我知道通用解决方案,但我对正确的编译器行为应该是什么感兴趣。
-
建议您添加 [language-lawyer] 标签。
-
GCC 不允许
struct { int x; } v = { {1} };,尽管它允许int x = {1};。我认为这是 GCC 的错误。
标签: c++ gcc clang language-lawyer