小编Xo *_*ang的帖子

为什么不是std :: array临时constexpr的operator []?

当我发现你不能在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)

c++ constexpr c++11 stdarray c++14

12
推荐指数
1
解决办法
1913
查看次数

C++ 14:从参数值初始化constexpr变量

假设我有一个可以通过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++ gcc clang constexpr c++14

9
推荐指数
1
解决办法
955
查看次数

在C中打印浮点数,同时避免可变参数提升加倍

如何在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中更有效地打印浮子?

c floating-point printf promotions

8
推荐指数
2
解决办法
6553
查看次数

标签 统计

c++ ×2

c++14 ×2

constexpr ×2

c ×1

c++11 ×1

clang ×1

floating-point ×1

gcc ×1

printf ×1

promotions ×1

stdarray ×1