小编αλε*_*λυτ的帖子

通过XOR在单行中交换整数.在c ++ 11中真的允许吗?

我仍然无法清楚地理解表达式是否x ^= y ^= x ^= y; 在C++ 11中有效(正如他们在这个帖子中所说的那样)或者它会导致未定义的行为?

这个链接给出的理由似乎令人信服,但是clang却发出警告:

警告:未经测试的修改和访问'x'[-Wunsequenced]

而且,如果两个版本:

x ^= y ^= x ^= y; // (1) 
x = x ^ (y = y ^ (x = (x ^ y))); // (2)
Run Code Online (Sandbox Code Playgroud)

被认为是等价的(并且在C++ 11中定义明确),为什么它会给出不同的结果(第一,第二)?

另外,应该注意的是,gcc 仅在第二版代码上给出关于序列点的警告.

c++ undefined-behavior language-lawyer c++11

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

为什么大括号中的标量不作为initializer_list进行处理

请考虑以下代码段:

#include <iostream>
#include <initializer_list>

struct C
{
    C(std::initializer_list<int>) { std::cout << "list\n"; }
    C(std::initializer_list<int>, std::initializer_list<int>) { std::cout << "twice-list\n"; }
};

int main()
{
    C c1 { {1,2}, {3} }; // twice-list ctor
    C c2 { {1}, {2} }; // why not twice-list ?
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现场演示.

为什么c2变量括号中的标量值不被解释为单独的std :: initializer_list?

c++ initializer-list language-lawyer

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

使用clang分析器分析Embarcadero RAD Studio项目

我想知道是否可以使用Clang Static Analyzer分析Embarcadero RAD Studio C++项目.据我所知,我需要一个makefile或任何能够用clang构建项目的东西.但是Embarcadero使用它自己的C++扩展,因此无法使用clang编译代码.

如果可以进行分析(至少对于单独的文件),如果有人发布了我需要做的一系列步骤,那将是一件好事.

static-analysis c++builder clang-static-analyzer llvm-clang

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

从同一类型的静态成员进行类内初始化

以下代码是否有效,例如是否带来未定义的行为?

struct S
{
    int i = s.i;
    static S s;
};

S S::s;

int main()
{
    S a;  // a.i = 0
    S::s.i = 42;
    S b;  // b.i = 42
}
Run Code Online (Sandbox Code Playgroud)

据我所知,所有具有静态存储持续时间的变量都是零初始化.因此s.i0S::s创造,一切都是好的.但也许我错过了一些东西.

c++ initialization static-members language-lawyer in-class-initialization

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

隐式对的模板参数推导

考虑以下代码:

#include <utility>
#include <initializer_list>

template <typename T>
struct S {
    S(std::initializer_list<std::pair<T, int>>) {};
};

int main()
{
    S s1 {{42, 42}};          // failed due to implicit `std::pair` from `{42, 42}`
    S s2 {std::pair{42, 42}}; // ok
}
Run Code Online (Sandbox Code Playgroud)

s1由于std::pair从大括号初始值设定项列表隐式创建,实例无法编译。

有没有一种方法(可能通过用户定义的类型推导指南)s1无需在声明中指定其他类型即可进行编译?

c++ template-argument-deduction

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

命名实体作为模板参数列表中T的指针

在C++ 11标准(第3.3.9/3节)中,我找到了这段代码:

template<class T, T* p, class U = T> class X { /? ... ?/ };
Run Code Online (Sandbox Code Playgroud)

任何人都可以向我解释哪些可能(和有用的)代码可以包含在类X的主体中?随着参数的使用p.

c++ standards templates c++11

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

检测(无意义)分配给临时对象

当您尝试分配给临时对象时,是否有任何编译器选项允许您收到警告?

例子:

struct S {
    S op() { return S(); }
};

int main() {
    S s;
    s.op() = s; // assign to temporary. Wants to warn here.
}
Run Code Online (Sandbox Code Playgroud)

我知道你可以声明opas的返回类型const来防止这种情况,但现在我感兴趣的只是编译器选项。

您可以使用任何流行的现代编译器。

c++ compiler-warnings compiler-options temporary-objects

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

为什么 UuidFromString 函数请求指向 unsigned char 的非常量指针?

我不知道为什么UuidFromString函数需要指向unsigned char 的非常量指针。为什么不呢?const char*

我的想法是不需要对第一个参数指出的数据进行修改。

c++ winapi constants

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

未命名命名空间内名称的外部链接

根据 C++ 标准的第 3.5/4 条:

未命名命名空间或在未命名命名空间内直接或间接声明的命名空间具有内部链接。

同时在第 7.3.1.1 段中,我们有注释 96):

尽管未命名命名空间中的实体可能具有外部链接,但它们有效地由其翻译单元唯一的名称限定,因此无法从任何其他翻译单元看到。

如果标准保证无法从另一个翻译单元访问未命名命名空间内定义的名称,如何显式地为未命名命名空间内的名称建立外部链接,以及如何检查链接实际上是外部的?

在哪些情况下对未命名命名空间内的名称进行显式外部链接有用?

c++ unnamed-namespace c++14

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

c ++ std :: types而不是相应的c类型

例如,考虑<cstdint>标题.C++标准:

标头定义了与C标准库标头相同的所有类型和宏<stdint.h>.

那么是否需要在某处使用say std::int8_t而不是短C形式int8_t

c++

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