相关疑难解决方法(0)

哪个 C++ 草案?

我对当前的 C++ 标准感兴趣,并且对http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/上的链接有点困惑。新版本应该是什么?我应该寻找什么标题?是“工作草案,编程语言 C++ 标准”还是“编程语言 \xe2\x80\x94 C++ ”?这些论文有什么区别?为什么N4141纸张有密码保护,而较新的N4296则没有?

\n\n

问题在哪里可以找到当前的 C 或 C++ 标准文档?有一个很好的草稿列表,但我仍然无法分辨草稿的“稳定”版本是什么,即我可以使用什么作为 C++11 的参考?

\n

c++ standards c++11

5
推荐指数
0
解决办法
853
查看次数

"§27.7.3.6.2/ 1"是指什么?

当我读到一些问题时,我发现人们更喜欢使用" §27.7.3.6.2/ 1 [ostream.inserters.arithmetic] "之类的东西来描述他们的问题.我相信它有与C++相关的东西.

以下是该问题的链接地址: 格式化输出算术插入器

我想问的是:" §27.7.3.6.2/ 1 "是指什么?这是指一本书还是其他什么?如果是书,请告诉我该书的名称.

c++ language-lawyer

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

什么是C/C++中的"安全"和"不安全"代码?

C/C++中"安全"和"不安全"代码有什么区别?

我在文章中读到"C++在导致严重安全漏洞的方面不安全":Rust如何与其他语言进行比较.什么是不安全的代码不安全?

c c++

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

比较不同符号的 8 位类型(int8_t、uint8_t):结果是否确定?

我运行这个简单的程序

#include <stdint.h>
#include <iostream>
int main() {
    uint8_t x = 100;
    int8_t y = -128;
    if (x < y) {
        std::cout << (int) x << " is less than " << (int) y << std::endl;
    } else {
        std::cout << (int) y << " is less than " << (int) x << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

有输出,正确:

-128 is less than 100
Run Code Online (Sandbox Code Playgroud)

起初我很惊讶地看到没有生成签名警告。
然后我很惊讶没有进行错误的转换(-128 -> 255),因此没有得到错误的结果。
然后我读了这个

1除 bool、char16_t、char32_t 或 wchar_t 之外的整数类型的纯右值,其整数转换等级 (4.13) 小于 int …

c c++ gcc4.9

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

数组允许的最大维数是多少?为什么?

声明数组时可以使用的最大维数是多少?

例如.

#include <iostream.h>
#include <conio.h>
{
       int a[3][3][3][4][3];
       a[2][2][2][2][2] = 9;
}
Run Code Online (Sandbox Code Playgroud)

那么,我们可以在一个数组上声明多少维度.它有什么限制?它背后的原因是什么?

c c++

5
推荐指数
2
解决办法
568
查看次数

为什么可以针对非易失性访问重新排序此易失性访问?

下面的代码示例来自一个介绍其效果的中文博客volatile.左边是C代码; 另一个是生成的汇编代码.

// cordering.c                                gcc -O2 -S -masm=intel cordering.c

int A;
volatile int B;
void foo()                                    mov   eax, DWORD PTR B[rip]
{                                             mov   DWORD PTR B[rip], 0
    A = B + 1;                                add   eax, 1
    B = 0;                                    mov   DWORD PTR A[rip], eax
}                                             ret
Run Code Online (Sandbox Code Playgroud)

正如我们在汇编代码中看到的那样,副作用A放在副作用之后B,即使Bvolatile合格的.但是,cppreference.com说:

[W]在单个执行线程中,易失性访问不能优化或重新排序,具有在易失性访问之前排序排序的另一个可见副作用.

这里的副作用A之前是排序的B,所以我认为编译器执行此操作是非法的.我对吗?


作为补充,博客说如果我们想要保证a volatilenon-volatiletype 之间的顺序,我们需要同时做到volatile:

// cordering.c                                gcc …
Run Code Online (Sandbox Code Playgroud)

c++ volatile non-volatile

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

在C ++ 17中分配给数组

这是一些代码:

int main()
{
    using T = int[3];
    T a;
    a = T{};
}
Run Code Online (Sandbox Code Playgroud)

据我所知,根据C ++ 17标准,此代码是正确的,但是我尝试的每个编译器都拒绝了它。

此代码实际上不正确吗?如果是这样,该标准的哪些条款?


到目前为止,我的研究是:在C和较旧版本的C ++中,代码不正确,因为赋值运算符的左操作数必须是可修改的左值,a或者不是,或者没有明确指定。但是由于C ++ 17 a被明确指定为可修改的左值(C ++ 17 [basic.lval] / 7)。

此处未应用数组到指针的转换:[expr.ass]没有明确指定它,[expr] / 9和[expr] / 10似乎没有适用:=期望将prvalue作为正确的操作数,并提供了prvalue。(并且期望将glvalue作为左操作数,并提供了glvalue)。如果在期望有prvalue的情况下提供了glvalue,则适用这些条款,反之亦然。

[expr.ass] / 3表示将右表达式隐式转换为左操作数的类型。但是由于双方的类型相同,int[3]因此似乎不需要进行转换。

因此,我看不到任何将[expr.ass] / 2排除在外的子句,即右侧的值存储在左侧所指的对象中。


最新的草案围绕[basic.lval] / 7和[expr] / 9-10中的子句移动,但似乎并没有改变其含义,甚至将[expr.ass] / 2改为更清晰:

在简单赋值(=)中,通过用右操作数的结果替换其值来修改左操作数所引用的对象。

c++ arrays variable-assignment language-lawyer c++17

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

“强制转换指定转换”是什么意思?

在 C 1999 注释 86 中,对 6.5.4 5(我的粗体)说话

如果表达式的值表示的精度或范围比强制转换命名的类型(6.3.1.8)所要求的精度或范围大,则即使表达式的类型与命名类型相同,该强制转换也会指定转换

signed char a = -2;
unsigned char b = 1;
b = (short)a + (short)b;
Run Code Online (Sandbox Code Playgroud)

b = (short)a + (short)b;. 这是一个例子

如果表达式的值表示的精度或范围比由强制转换 (6.3.1.8) 命名的类型所需的精度或范围更大,

因为如果没有强制转换,a并且b两者都被提升为int,这比short强制转换命名的类型(假设short是 16 位和int32 位)具有更高的精度或范围。

那么,在这种情况下,后一句

然后即使表达式的类型与命名类型相同,转换也会指定转换。

我想知道这会如何影响b = (short)a + (short)b;

我的想法很简单。因为(cast)具有比加法更高的优先级+,首先ab被强制转换(short),然后两个操作数+被转换为通常的算术转换。但是这句话“即使表达式的类型与命名类型相同,转换也指定了转换”让我感到困惑。

c c99 language-lawyer typecasting-operator

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

函数调用中表达式的求值顺序

给定一个函数调用func(E1, E2, E3),其中 E1 等是任意表达式,每个表达式相对于每个其他表达式是不确定的,还是所有表达式都是未排序的(即评估可以重叠)?

我看过这个cppreference 页面,它在规则 15 中使用了这句话

在函数调用中,每个参数初始化的值计算和副作用相对于任何其他参数的值计算和副作用是不确定的。

我认为这与我要问的不太一样,因为参数的初始化只是参数表达式评估的最后一步。

但是讨论其他内容的规则 21 似乎暗示函数调用中的每个子表达式都是不确定的

括号中的初始值设定项中以逗号分隔的表达式列表中的每个表达式都像函数调用一样求值(不确定顺序)

所以我有点困惑,任何指导表示赞赏。

c++ c++17

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

我在哪里可以找到涵盖K&R1/2,C89-C1X及其起源的C(和/或C++)关键字列表?

我已经接触过许多编码指南,每个编程指南都为命名"事物"提供了指导.一个特定的C89命名规则触发了这个问题:明确禁止对变量使用名称"new",因为在C++中这是一个关键字.

这让我想到了下一个标准,C99有很好的文献记载,但C11相对较新(2014).标准委员会还有几个扩展仍在进行中.

因此,我想知道是否有人可以提供包含关键字及其来源的列表,以便制定一组命名规则,包括为什么要避免使用多个名称的原因.

虽然严格说话complex不是关键词,但最好包括类似的定义.而且C++信息也很受欢迎.

c c++ language-lawyer

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