P1008("prohibit aggregates with user-declared constructors")在实践中什么时候有用?
When is P1008 ("prohibit aggregates with user-declared constructors") useful in practice?
P1008("禁止使用用户声明的构造函数进行聚合">(已成为C++20标准的一部分,以防止在使用聚合初始化时出现意外行为:
struct X {
int i{42};
X() = delete;
};
int main() {
X x2{3}; // Compiles in C++17, error in C++20
}
我同意不应编译上述X x2{3};
语句。然而,我遇到的所有证明P1008的例子都是不现实的——它们纯粹是语法上的,基本上没有意义的foo
/bar
/baz
代码片段。
P1008在实践中解决了什么问题?我发现很难想象我会如何在一个真实的程序中写出像上面的X
这样的东西。
删除C++17聚合中的默认构造函数,而不提供其他构造函数进行初始化,这对我来说似乎不现实。
最明显的情况是:
struct X
{
private:
X() = default;
};
X x{};
这不是一个应该能够在私有访问上下文之外初始化的类型。但也有可能。
现在,这样的类型可能看起来很傻,但它们实际上对于实现通过转发函数工作的私有函数很有用。例如,make_shared
不能调用声明为private
的构造函数,即使您将make_shared
模板作为好友也是如此。因此,您将构造函数设为public
,但要求用户传递一个只能由具有private
访问权限的人构造的类型的实例。因此X
将是目标类的成员类型,或者X
将使目标类成为friend
。
相关文章:
- 什么时候在C++中返回常量引用是个好主意
- 什么时候最好在子进程中使用 CPU 或 I/O 密集型代码 [ C++ ]
- 我什么时候会默认(而不是删除)基类中的复制和移动操作
- 使用 gtest 框架在单元测试代码中检查目标对象的私有变量的最佳实践是什么?
- 我不明白在这个例子中什么时候调用构造函数
- P1008("prohibit aggregates with user-declared constructors")在实践中什么时候有用?
- clang的"-Ofast"选项在实践中有什么作用,特别是对于与gcc的任何差异?
- 什么时候在 c++ 中使用 exit() 与异常更好?
- C++什么时候是使用无默认构造函数与getter和setters与直接调用类中的变量的正确时机
- 我什么时候不希望在Visual Studio中启用“Control Flow Guard Microsoft
- 您什么时候使用哪种方法从另一个文件中获取变量
- 在C++中,对象什么时候真正被销毁?delete(ptr)做什么
- 在编译过程中,琐碎的(没有效果的)代码什么时候会被删除
- 在 API 设计中,我什么时候应该更喜欢长度为 2 std::tuple 而不是一对
- 什么时候将整个C 类框架放入DLL中
- 什么时候应该将 Stream 从 DataWriter 和 DataReader 中分离出来?此 I/O 模型的一般准则是什么?
- 我们什么时候需要在纯C 程序中使用结构?在纯C 程序中至关重要
- 在c++中什么时候应该使用头文件
- 在c++中什么时候应该使用单例类?
- c中什么时候需要深度复制?