相关疑难解决方法(0)

C++标准的核心语言规范中的注释和示例是非规范性的吗?

通常在SO(以及其他地方),我已经看到C++标准中的注释和示例不是规范性的说法 - 我可能已经多次提出这个主张.

但是,我在C++标准的核心语言规范中找不到这个事实的证据(目前我在查看n3979 C++ 14工作草案).

我能找到的最接近的报价见第17.5.1.2/2段:

标有"注释:"或"示例:"的段落是提供信息的,其他段落是规范性的.

但是,除非我错误地认为该段只适用于图书馆部分(即第18至30条和附件D).

因此,问题是:C++标准中的所有注释和示例都是非规范性的吗?脚注怎么样?

c++ iso language-lawyer c++11 c++14

21
推荐指数
2
解决办法
606
查看次数

读取未初始化的值总是未定义的行为吗?或者有例外吗?

在读取值时,未定义行为(UB) 的一个明显示例是:

int a;
printf("%d\n", a);
Run Code Online (Sandbox Code Playgroud)

下面的例子呢?

int i = i;     // `i` is not initialized when we are reading it by assigning it to itself.
int x; x = x;  // Is this the same as above?
int y; int z = y;
Run Code Online (Sandbox Code Playgroud)

上面的三个例子都是 UB,还是有例外?

c

5
推荐指数
1
解决办法
252
查看次数

如果一个全局变量被初始化两次(静态,然后是动态),哪个初始化开始它的生命周期?

受到这个问题的启发。

我们知道具有非constexpr初始化器的全局变量会经历两种不同的“初始化”:

  • 首先是“静态初始化”,它对它们进行零初始化。
  • 其次,“动态初始化”,它使用用户提供的初始化程序。

哪些初始化启动了变量生命周期?[basic.life]令人惊讶的是无益的:

对象的生命周期......开始于:......它的初始化(如果有)完成

我看到几个选项:

  1. 最后一次初始化开始生命周期。
  2. 第一次初始化开始生命周期。
  3. 每次连续初始化都会破坏现有对象并在其位置创建一个新对象。

(1) 最有意义,但它会使稍后动态初始化的对象的静态初始化几乎无用。

(2)会产生有趣的效果。例如,静态初始化命令失败突然不再是 UB(本身)了。

(3) 会很奇怪。

c++ language-lawyer

5
推荐指数
1
解决办法
190
查看次数

构造一个没有默认构造函数的空对象

假设我有一个类型F。我知道这F是空的,但F没有默认构造函数,所以我不能F()用来构造它。有没有办法获得有效的类型对象F?我似乎记得有一次提到工会的神秘用法有这样一种方式。理想情况下,这将是constexpr友好的。


这很有用,因为无捕获 lambda 仅在 C++20 中获得了默认构造函数。在 C++17 中,如果我想“将 lambda 传递给模板”并在没有实例的情况下调用该 lambda,我需要能够从类型中重建它。

auto const f = [](int x) { return x; };
using F = decltype(f);

static_assert(std::is_empty_v<F>);
static_assert(!std::is_default_constructible_v<F>);

magically-construct-an-F(42);
Run Code Online (Sandbox Code Playgroud)

c++ language-lawyer empty-class c++17

3
推荐指数
2
解决办法
649
查看次数

是 int x = x; 在 C++ 中定义良好?

我有以下代码:

// in global scope:
int x = x;
Run Code Online (Sandbox Code Playgroud)

此代码编译时不会对 GCC 和 clang发出警告:

x:
  .zero   4
Run Code Online (Sandbox Code Playgroud)

这是明确定义的吗?它是如何工作的?

c++ initialization global-variables language-lawyer

1
推荐指数
1
解决办法
103
查看次数