当我发现你不能在C++ 11中使用元素作为初始化器时,我正在将一些值填充到a中constexpr std::array,然后将编译时静态良好constexpr值继续为更多值constexpr.
这是因为在C++ 14之前std::array::operator[]实际上没有标记constexpr:https://stackoverflow.com/a/26741152/688724
在编译器标志升级之后,我现在可以使用a的元素constexpr std::array作为constexpr值:
#include <array>
constexpr std::array<int, 1> array{{3}};
// Initialize a constexpr from an array member through its const operator[]
// that (maybe?) returns a const int & and is constexpr
constexpr int a = array[0]; // Works in >=C++14 but not in C++11
Run Code Online (Sandbox Code Playgroud)
但有时我想在constexpr计算中使用临时数组,但这不起作用.
// Initialize a constexpr from a temporary
constexpr int b = …Run Code Online (Sandbox Code Playgroud) 假设我有一个可以通过constexpr函数返回常量表达式的类:
template<int N>
struct Foo {
constexpr int Bar() const { return N; }
};
Run Code Online (Sandbox Code Playgroud)
如果我想初始化constexpr值Foo::Bar(),我应该如何传递类型的参数Foo?我已经尝试了这两个,constexpr每个都有一个示例变量来测试它是否可以初始化:
template<int N>
constexpr int ByValue(Foo<N> f) {
constexpr int i = f.Bar();
return f.Bar();
}
template<int N>
constexpr int ByReference(const Foo<N> &f) {
constexpr int i = f.Bar();
return f.Bar();
}
constexpr int a = ByValue(Foo<1>{});
constexpr int b = ByReference(Foo<1>{});
Run Code Online (Sandbox Code Playgroud)
但是clang 3.7引发了一个错误,ByReference而gcc> = 5.1则没有:现场演示
main.cpp:15:25: error: constexpr variable 'i' must be initialized …Run Code Online (Sandbox Code Playgroud) 如何在C中打印(即stdout)一个浮点数,而不是在传递给printf时将其提升为double?
这里的问题是C中的可变参数函数将所有float参数提升为double,这会导致两次不必要的转换.例如,如果在GCC中打开-Wdouble-promotion并进行编译
float f = 0.f;
printf("%f", f);
Run Code Online (Sandbox Code Playgroud)
你会得到
warning: implicit conversion from 'float' to 'double' when passing argument to function
Run Code Online (Sandbox Code Playgroud)
我使用相对较少的处理能力(72MHz ARM Cortex-M3),我肯定是浮点数据的ASCII输出的瓶颈.由于架构缺乏硬件FPU,因此必须在单精度和双精度之间进行转换并不重要.
有没有办法在直线C中更有效地打印浮子?