Oer*_*ted 3 c++ default-constructor language-lawyer clang++
我有一个与下面的代码片段非常相似的代码:
#include <vector>
struct dummy
{
std::vector<int> const data;
dummy() = default;
};
Run Code Online (Sandbox Code Playgroud)
大多数编译器都毫无问题地接受此代码,但clang版本 9 至 14 除外:
警告:显式默认的默认构造函数被隐式删除 [-Wdefaulted-function-deleted]
注意:“dummy”的默认构造函数被隐式删除,因为 const 限定类型“const std::vector”的字段“data”不会被初始化
问题clang 15再次消失。
居住
注意,如果const删除,错误也会消失。
然而我希望data被初始化为一个const空向量。
这是一个clang错误吗?否则,为什么这段代码被拒绝(为什么其他编译器不抱怨)?
在CWG 2394决议之前,如果没有默认初始值const设定项的类类型的任何非静态成员没有用户提供的默认构造函数,则默认的默认构造函数被定义为已删除。
此规则的目的是避免出现以下情况:您将对象默认初始化为不确定状态,然后不可能将其修改为任何可用状态,这只能是错误的。
然而,这个条件并没有完全实现这一点,DR 通过提出与变量声明相同的要求来解决它,在P0490const中的 NB 注释 RU1 解析之后,正确地认为即使是非用户提供的默认构造函数也可能正确初始化。
现在的问题是 libstdc++std::vector通过默认它实现了默认构造函数(参见例如githubmirror)。结果是默认构造函数不是用户提供的。
这似乎是一个有效的实现,甚至在 CWG 问题或 NB 评论解决之前也是如此,因为容器要求仅在需要格式良好的表达式和声明中说明,并且它似乎不包含任何const默认初始化我可以告诉。
因此,在尚未实现缺陷报告的 Clang 版本中以及使用 libstdc++ 时,它将失败。
我还没有检查过,但旧版本的 Clang 可能使用旧的 libstdc++ 版本,其中默认构造函数尚未以这种方式实现。(请参阅2018 年的GCC 提交 e6cad9872b098f50aefb39019b6b1ba74d8c6c07)
| 归档时间: |
|
| 查看次数: |
262 次 |
| 最近记录: |