标签: constexpr

基于constexpr的计算图灵完成了吗?

我们知道C++模板元编程是Turing完整的,但预处理器元编程却不是.

C++ 11为我们提供了一种新形式的元编程:constexpr函数的计算.这种计算形式是图灵完备吗?我在想,因为在constexpr函数中允许递归和条件运算符(?:),它会是,但我希望有更多专业知识的人来确认.

c++ metaprogramming computation-theory constexpr c++11

42
推荐指数
2
解决办法
2715
查看次数

GCC接受`constexpr struct {} s;`但Clang拒绝它.谁是对的?

以下代码与GCC编译良好:

constexpr struct {} s;
Run Code Online (Sandbox Code Playgroud)

但Clang拒绝了它,出现以下错误:

错误:没有用户提供的默认构造函数,默认初始化const类型'const struct(anonymous struct at ...)'的对象

我已经测试了我能够在https://gcc.godbolt.org/找到的所有GCC和Clang版本.每个版本的GCC都接受代码,而Clang的每个版本都拒绝它.

我想知道在这种情况下哪个编译器是正确的?
标准对此有何看法?

c++ gcc clang language-lawyer constexpr

41
推荐指数
1
解决办法
1659
查看次数

C++ 11:编译数组的时间计算

假设我有一些constexpr函数f:

constexpr int f(int x) { ... }
Run Code Online (Sandbox Code Playgroud)

我在编译时知道一些const int N:

#define N ...;
Run Code Online (Sandbox Code Playgroud)

要么

const int N = ...;
Run Code Online (Sandbox Code Playgroud)

根据你的答案需要.

我想要一个int数组X:

int X[N] = { f(0), f(1), f(2), ..., f(N-1) }
Run Code Online (Sandbox Code Playgroud)

这样在编译时评估函数,X中的条目由编译器计算,结果放在我的应用程序映像的静态区域,就像我在X初始化列表中使用整数文字一样.

有什么方法可以写这个吗?(例如,使用模板或宏等)

我有最好的:(感谢Flexo)

#include <iostream>
#include <array>
using namespace std;

constexpr int N = 10;
constexpr int f(int x) { return x*2; }

typedef array<int, N> A;

template<int... i> constexpr A fs() { return A{{ f(i)... }}; }

template<int...> struct S;

template<int... i> struct S<0,i...>
{ static …
Run Code Online (Sandbox Code Playgroud)

c++ templates constexpr c++11

40
推荐指数
1
解决办法
8372
查看次数

我何时会在constexpr上使用std :: integral_constant?

#include <iostream>
#include <type_traits>

int main(){

    //creating an integral constant with constexpr
    constexpr unsigned int speed_of_light{299792458};

    //creating an integral constant with std::integral_constant
    typedef std::integral_constant<unsigned int, 299792458> speed_of_light_2;

    //using them
    std::cout << speed_of_light/2 << '\n';
    std::cout << speed_of_light_2::value/2 << '\n';

}
Run Code Online (Sandbox Code Playgroud)

有关std :: integral_constant的特别之处,我会选择在constexpr上使用它吗?
他们的行为和用例看起来与我相同.我正在尝试考虑某种模板场景,其中constexpr可能不够.

c++ templates constants constexpr c++11

40
推荐指数
2
解决办法
9178
查看次数

constexpr与静态const:哪一个更喜欢?

定义整数类型的编译时常量,如下所示(在函数和类范围内),哪种语法最好?

static const int kMagic = 64; // (1)
constexpr int kMagic = 64;    // (2)
Run Code Online (Sandbox Code Playgroud)

(1)也适用于C++ 98/03编译器,而(2)至少需要C++ 11.这两者之间还有其他差异吗?在现代C++代码中是否应该首选其中一个,为什么?


编辑

我用Godbolt的CE尝试了这个示例代码:

int main()
{
#define USE_STATIC_CONST
#ifdef USE_STATIC_CONST
  static const int kOk = 0;
  static const int kError = 1;
#else
  constexpr int kOk = 0;
  constexpr int kError = 1;
#endif
  return kOk;
}
Run Code Online (Sandbox Code Playgroud)

对于这种static const情况,这是GCC 6.2生成的程序集:

main::kOk:
        .zero   4
main::kError:
        .long   1
main:
        push    rbp
        mov     rbp, …
Run Code Online (Sandbox Code Playgroud)

c++ const constexpr c++11

40
推荐指数
2
解决办法
2万
查看次数

在C++ 11中,sqrt被定义为constexpr?

在C++ 11中std::sqrt定义为constexpr,即它可以合法地从其他constexpr函数或编译时上下文中使用,如数组大小或模板参数吗?g ++似乎允许它(使用-std=c++0x),但我不确定我是否可以将其视为权威,因为c ++ 0x/c ++ 11支持仍然不完整.我似乎无法在互联网上找到任何东西的事实让我不确定.

看起来这应该是人们可以轻易找到使用谷歌的东西,但我已经尝试过(现在40分钟......)并且找不到任何东西.我可以找到几个建议,将constexpr添加到标准库的各个部分(例如这个),但没有关于sqrt或其他数学函数.

c++ constexpr c++11

39
推荐指数
6
解决办法
1万
查看次数

constexpr const vs constexpr变量?

很明显constexpr意味着const,因此常见的是:

constexpr int foo = 42; // no const here
Run Code Online (Sandbox Code Playgroud)

但是,如果你写:

constexpr char *const str = "foo";
Run Code Online (Sandbox Code Playgroud)

然后,如果传递了-Wwrite-string标志,GCC将产生"警告:从字符串常量弃用转换为'char*'".

写作:

constexpr const char *const str = "foo";
Run Code Online (Sandbox Code Playgroud)

解决了这个问题.

那么constexpr const和constexpr真的一样吗?

c++ gcc const constexpr c++11

39
推荐指数
2
解决办法
1万
查看次数

如何申报constexpr extern?

是否可以声明一个变量extern constexpr并在另一个文件中定义它?

我试了但是编译器给出了错误:

constexpr变量' i'的声明不是定义

在.h:

extern constexpr int i;
Run Code Online (Sandbox Code Playgroud)

在.cpp中:

constexpr int i = 10; 
Run Code Online (Sandbox Code Playgroud)

c++ extern constexpr

39
推荐指数
3
解决办法
9837
查看次数

"constexpr if"vs"if"with optimizations - 为什么需要"constexpr"?

C++ 1z将引入"constexpr if" - 如果将根据条件删除其中一个分支.似乎合理有用.

但是,没有constexpr关键字是不可能的?我认为在编译期间,编译器应该知道编译时间是否已知.如果是,即使是最基本的优化级别也应该删除不必要的分支.

例如(参见godbolt:https://godbolt.org/g/IpY5y5 ):

int test() {
    const bool condition = true;
    if (condition) {
      return 0;
    } else {
      // optimized out even without "constexpr if"
      return 1;
    }
}
Run Code Online (Sandbox Code Playgroud)

Godbolt探险家表示,即使是带有-O0的gcc-4.4.7也没有编译"返回1",所以它实现了constexpr所承诺的.显然,当条件是constexpr函数的结果时,这样的旧编译器将无法这样做,但事实仍然存在:现代编译器知道条件是否为constexpr,并且不需要我明确地告诉它.

所以问题是:

为什么"constexpr if"需要"constexpr"?

c++ constexpr c++17 if-constexpr

39
推荐指数
1
解决办法
1455
查看次数

为什么MSVC++ 11拒绝对函数进行constexpr限定?

因此,使用constexpr,MSVC(Visual Studio 2012)在尝试constexpr使用此简单程序(包括省略)使用关键字限定我的函数时给了我一个错误:

constexpr int factorial(int n)
{
    return n <= 1 ? 1 : (n * factorial(n-1));
}

int main(void)
{
    const int fact_three = factorial(3);
    std::cout << fact_three << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

constexpr 带有以下消息的红色下划线:

错误:此声明没有存储类或类型说明符

并尝试编译该程序给出了以下输出:

1> main.cpp(5):错误C2144:语法错误:'int'前面应加';'

1> main.cpp(5):错误C4430:缺少类型说明符 - 假定为int.注意:C++不支持default-int

它真的让我感到困惑,因为它是Cppreference 用来说明其使用constexpr的一个例子.起初我使用了一个返回文字的简单函数,即constexpr int func(){return 5;}但产生了同样的错误.我将第一条消息解释为"它应该是结构或类的成员函数",但Cppreference的示例显示它显然不是必需的.

那么,我在这里明显缺少什么?

c++ constexpr c++11 visual-studio-2012

38
推荐指数
1
解决办法
7100
查看次数