【问题标题】:std::cout usage in constructors of objects with static storage durationstd::cout 在具有静态存储持续时间的对象的构造函数中的用法
【发布时间】:2016-06-08 15:15:42
【问题描述】:

在 C++98 / C++03 中具有 statc 存储持续时间的对象的构造函数中使用 std::cout 是否安全?

answer 看来,它不是,但它不包含标准中的任何引号。

只有在 C++11 和 C++14 中才安全吗?

【问题讨论】:

  • 安全与否,为什么?!
  • @David Haim 为什么?为什么我要在这样的对象中使用std::cout
  • 在构造函数内部..
  • @DavidHaim,没听说过在构造函数内部打印出来???
  • @DavidHaim 作为一个穷人的启动日志系统,或者只是一个调试工具,为什么不呢?此外,实际上“为什么”只是另一个问题,与“是否安全”无关。

标签: c++ c++11 c++14 c++03 c++98


【解决方案1】:

来自 C++14 (N3797),§27.4p2:

在第一次之前或期间的某个时间构造对象并建立关联 构建 ios_base::Init 类的对象的时间,并且在任何情况下,在 main 的主体开始执行之前 cution.295 程序执行过程中对象没有被销毁。296 包含的结果 在翻译单元中应该定义为带有静态存储的 ios_base::Init 实例 期间。同样,整个程序的行为就好像至少有一个 ios_base::Init 实例 具有静态存储持续时间。

C++98 使用类似的术语,但没有“as if”子句。

基本上,这个禁止main之前使用以下内容:

#include <ostream>
extern std::ostream cout;

【讨论】:

  • 那么 C++98 / C++03 呢?
  • 所以它在所有 C++ 标准中都具有相同的行为,我在这些对象中使​​用 std::cout 是完全安全的,对吧?
  • 有一连串的 DR,从 LWG 369 开始,到 LWG1123 结束,在 C++98 和 C++11 之间改变了这一点。虽然这在实践中可能很好,但声称 C++98 和 C++03 中的标准文本支持这一点充其量是误导。
  • 并且该段声称禁止的代码(假设您实际上打算将cout放入std)实际上已经被您不能添加声明的规则禁止std 除非另有说明。
  • @T.C.好像这曾经阻止过任何人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-28
  • 2019-08-09
  • 2015-01-24
  • 2014-03-23
  • 1970-01-01
  • 2016-07-05
  • 2012-11-17
相关资源
最近更新 更多