我想知道,如果我使用禁用异常处理的选项编译我的程序,new T
仍然会抛出?bad_alloc
-fno-exceptions
或将编译器(GCC和铛支持该选项)隐含变换使用new T
到new (nothrow) T
?
如何static_assert
在一个constexpr
函数中正确执行?例如:
constexpr int do_something(int x)
{
static_assert(x > 0, "x must be > 0");
return x + 5;
}
Run Code Online (Sandbox Code Playgroud)
这不是有效的C++ 11代码,因为constexpr函数必须只包含return语句.我不认为该标准有例外,但GCC 4.7不允许我编译这段代码.
我一直想知道为什么C++标准库已经使用char
类型而不是unsigned char
类型实例化了basic_ [io]流及其所有变体.char
表示(取决于它是否有符号),您可以对get()等操作进行上溢和下溢,这将导致所涉及变量的实现定义值.另一个例子是当你想使用它的put
函数输出一个未格式化的字节到ostream .
有任何想法吗?
注意:我仍然不相信.所以如果你知道明确的答案,你仍然可以发布它.
将lambda表达式视为可调用对象的"语法糖",可以表达未命名的基础类型吗?
一个例子:
struct gt {
bool operator() (int l, int r) {
return l > r;
}
} ;
Run Code Online (Sandbox Code Playgroud)
现在,[](int l, int r) { return l > r; }
是上述代码的优雅替代(加上gt的可调用对象的必要创建),但有没有办法表达gt(类型)本身?
一个简单的用法:
std::set<int, gt> s1; // A reversed-order std::set
// Is there a way to do the same using a lambda?
std::set<int, some-magic-here-maybe([](int l, int r) { return l > r; }) > s2;
Run Code Online (Sandbox Code Playgroud) 我在代码中看到了一个函数声明,如下所示
void error(char const *msg, bool showKind = true, bool exit);
Run Code Online (Sandbox Code Playgroud)
我首先想到这是一个错误,因为你不能在函数中间有默认参数,但是编译器接受了这个声明.谁看过这个吗?我正在使用GCC4.5.这是GCC扩展吗?
奇怪的是,如果我把它放在一个单独的文件中并尝试编译,GCC会拒绝它.我已经仔细检查了所有内容,包括使用的编译器选项.
我今天和我的同事想知道是否可以实现std :: vector来利用小缓冲区优化.通过查看C++ 11草案,我在23.3.1p8阅读
表达式a.swap(b),对于除数组之外的标准容器类型的容器a和b,应交换a和b的值,而不对单个容器元素调用任何移动,复制或交换操作.
这开始似乎取决于小缓冲区优化,但在as-if规则下,我们将被允许仍然对非类类型进行小缓冲区优化(因为我们无法观察到正在完成的复制).下一个文字似乎更难"傻瓜"
在交换之前引用一个容器中的元素的每个迭代器应该在交换之后引用另一个容器中的相同元素.
这是否足以阻止为std :: vector实现小缓冲区优化?有没有其他的路障或最终有可能有SBO的std :: vector?
我正在阅读Agner Fog的" 用C++优化软件 "(特定于英特尔,AMD和威盛的x86处理器),它在第34页说明
布尔变量存储为8位整数,值0表示false,1表示true.布尔变量是超定的,因为所有具有布尔变量作为输入的运算符检查输入是否具有除0或1之外的任何其他值,但是具有布尔值作为输出的运算符不能产生除0或1之外的其他值.布尔变量作为输入效率低于必要的效率.
这今天仍然适用于编译器吗?你能举个例子吗?作者说
如果确定操作数没有除0和1之外的其他值,则可以使布尔运算更有效.编译器没有做出这样的假设的原因是变量可能具有其他值,如果它们是未初始化或来自不明来源.
这是否意味着如果我拿一个函数指针bool(*)()
作为示例并调用它,那么对它的操作会产生效率低下的代码?或者是通过取消引用指针或从引用读取然后对其进行操作来访问布尔值的情况?
我有一个包含许多相同类型成员的结构,就像这样
struct VariablePointers {
VariablePtr active;
VariablePtr wasactive;
VariablePtr filename;
};
Run Code Online (Sandbox Code Playgroud)
问题是,如果我忘记初始化结构成员之一(例如wasactive
),如下所示:
VariablePointers{activePtr, filename}
Run Code Online (Sandbox Code Playgroud)
编译器不会抱怨它,但我会有一个部分初始化的对象。我怎样才能防止这种错误?我可以添加一个构造函数,但它会重复两次变量列表,所以我必须输入所有这些三次!
如果有 C++11 的解决方案(目前我仅限于该版本),还请添加C++11答案。不过,也欢迎使用最新的语言标准!
我有类Phenotype与以下构造函数:
Phenotype(uint8 init[NUM_ITEMS]);
Run Code Online (Sandbox Code Playgroud)
我可以像这样创建一个Phenotype:
uint8 data[] = {0,0,0,0,0};
Phenotype p(data);
Run Code Online (Sandbox Code Playgroud)
但是当我尝试创建这样的一个时,我收到一个错误:
Phenotype p = {0,0,0,0,0};
Run Code Online (Sandbox Code Playgroud)
输出:
$ make
g++ -Wall -g main.cpp -std=c++0x
main.cpp: In function ‘int main(int, char**)’:
main.cpp:109: error: no matching function for call to ‘Phenotype::Phenotype(<brace-enclosed initializer list>)’
main.cpp:37: note: candidates are: Phenotype::Phenotype(uint8*)
Run Code Online (Sandbox Code Playgroud)
该错误似乎表明有一种方法可以定义一个构造函数,该构造函数采用括号括起的初始化列表.有谁知道如何做到这一点?