我仍然无法清楚地理解表达式是否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 仅在第二版代码上给出关于序列点的警告.
请考虑以下代码段:
#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?
我想知道是否可以使用Clang Static Analyzer分析Embarcadero RAD Studio C++项目.据我所知,我需要一个makefile或任何能够用clang构建项目的东西.但是Embarcadero使用它自己的C++扩展,因此无法使用clang编译代码.
如果可以进行分析(至少对于单独的文件),如果有人发布了我需要做的一系列步骤,那将是一件好事.
以下代码是否有效,例如是否带来未定义的行为?
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.i是0在S::s创造,一切都是好的.但也许我错过了一些东西.
c++ initialization static-members language-lawyer in-class-initialization
考虑以下代码:
#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++ 11标准(第3.3.9/3节)中,我找到了这段代码:
template<class T, T* p, class U = T> class X { /? ... ?/ };
Run Code Online (Sandbox Code Playgroud)
任何人都可以向我解释哪些可能(和有用的)代码可以包含在类X的主体中?随着参数的使用p.
当您尝试分配给临时对象时,是否有任何编译器选项允许您收到警告?
例子:
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来防止这种情况,但现在我感兴趣的只是编译器选项。
您可以使用任何流行的现代编译器。
我不知道为什么UuidFromString函数需要指向unsigned char 的非常量指针。为什么不呢?const char*
我的想法是不需要对第一个参数指出的数据进行修改。
根据 C++ 标准的第 3.5/4 条:
未命名命名空间或在未命名命名空间内直接或间接声明的命名空间具有内部链接。
同时在第 7.3.1.1 段中,我们有注释 96):
尽管未命名命名空间中的实体可能具有外部链接,但它们有效地由其翻译单元唯一的名称限定,因此无法从任何其他翻译单元看到。
如果标准保证无法从另一个翻译单元访问未命名命名空间内定义的名称,如何显式地为未命名命名空间内的名称建立外部链接,以及如何检查链接实际上是外部的?
在哪些情况下对未命名命名空间内的名称进行显式外部链接有用?
c++ ×9
c++11 ×2
c++14 ×1
c++builder ×1
constants ×1
llvm-clang ×1
standards ×1
template-argument-deduction ×1
templates ×1
winapi ×1