如何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++ 11标准,何时应该在inline
关键字上使用constexpr
关键字?constexpr
关键字是否提供任何额外的优化inline
,或仅仅断言必须在编译时计算事物?
为什么constexpr
在调用不稳定的某些情况下在GCC 上工作,例如调用foo(x)
非constexpr
变量?这是GCC中的错误还是它实际上是标准的一部分?
就在最近,GCC 4.6.0与libquadmath一起发布.不幸的是,GNU支持Fortran,但不支持C或C++(所有包含的都是.so).我还没有找到在C++中使用这些新功能的方法,但GNU C确实支持__float128
保证四倍精度浮点数的类型.GNU C似乎不支持libquadmath中的数学函数,例如 fabsq
(绝对值,q
是quad的后缀).
有没有办法让这些函数在C++中运行,还是有一些替代库可以用于数学函数__float128
?在GCC中使用四倍精度浮子的最佳方法是什么?现在,我可以添加,减去和相乘它们,但这对我来说没用,考虑到我无法将它们转换为字符串或使用诸如truncq
和fabsq
创建我自己的字符串函数之类的函数.
在MinGW的SourceForge页面上,您可以下载GCC 4.5.2,这是最新版本.在GNU镜像上,您可以下载GCC 4.6源代码并使用其中一个可能的窗口目标进行编译:
i[3456789]86-w64-mingw*
i[3456789]86-*-mingw*
x86_64-*-mingw*
Run Code Online (Sandbox Code Playgroud)
使用其中一个目标与MinGW的传统GCC有区别吗?使用常规GCC是否有意义,因为它有更新的版本,或者等到MinGW的最新GCC发布后会更有意义吗?
经过一番调查后,我发现C++ 0x将元素向后存储在元组中.
例如,请使用以下代码:
std::tuple<char, char, char> x('\0', 'b', 'a');
char* y = (char*)&x;
std::cout << sizeof(x) << std::endl;
std::cout << y << std::endl;
Run Code Online (Sandbox Code Playgroud)
使用GCC 4.5.2编译时,我得到以下输出:
3
ab
Run Code Online (Sandbox Code Playgroud)
这最初困惑了我.为什么数据会向后存储?在通过GNU无意识混淆的标头搜索之后,我注意到实现类似于:
template<typename head, typename... tail> class tuple<head, tail...> : public tuple<tail...>
{
head value;
...
};
Run Code Online (Sandbox Code Playgroud)
因为基类包含最后一个元素,所以下一个派生类包含倒数第二个,等等,模板参数的实际顺序是相反的.
当我第一次进入元组时,我认为我可以将它们用于类似函数glInterleavedArrays()
,它将顶点数据数组设置为颜色,纹理坐标,法线和点的元组.当然,如果我创建一个元组数组,这些数据必须反向输入,如果你碰巧忘记按正确的顺序放置参数,这可能会导致非常奇怪的错误.
那么这样的事呢?
template<typename... head, typename tail> class tuple<head..., tail> : public tuple<head...>
{
tail value;
...
};
Run Code Online (Sandbox Code Playgroud)
根据GCC 4.5.2:
std::tuple<char, char, char> x('\0', 'b', 'a');
char* y = (char*)&x;
std::cout << sizeof(x) << std::endl; …
Run Code Online (Sandbox Code Playgroud) C++ 11标准保证逐字节副本始终对POD类型有效.但是某些琐碎的类型呢?
这是一个例子:
struct trivial
{
int x;
int y;
trivial(int i) : x(2 * i) { std::cout << "Constructed." << std::endl; }
};
Run Code Online (Sandbox Code Playgroud)
如果我要复制这个结构,逐字节,是否保证正确复制,即使它在技术上不是POD?是什么时候绘制的是什么时候不能对对象进行字节复制?
如何将变量区分为编译器构造的字符串?
例如,虽然右值"Hello, World"
是类型const char*
.const char*
本身并不意味着指针不能改变.一个char* const
指针不能改变,但是这不是什么编译器构成.
这是否意味着,对于任何拥有a的容器,const char*
数据应该通过C++的移动语义之外的方式复制?有没有办法只移动编译器构造的字符串并保留所有其他字符串?
例如,在GCC 4.5.2,它返回类型的方法int
,而不是int&
被当作返回int&&
.我不知道实际的标准是否应该是这样的,但这就是海湾合作委员会暂时做的事情.
编辑:澄清一下,我的意思是应该复制指针指向的实际内存.这意味着必须分配新内存,并且应将指针中的数据复制到新位置.
假设我输入的内容如下:
<strong>bunch <em>of</em> <span>random text
Run Code Online (Sandbox Code Playgroud)
我希望代码能够获取此字符串并将其转换为:
<strong>bunch <em>of</em> <span>random text</span></strong>
Run Code Online (Sandbox Code Playgroud)