标签: constexpr

在 C++14 中,constexpr 成员可以更改数据成员吗?

在 C++14 中,由于constexpr不再隐式constconstexpr成员函数可以修改类的数据成员:

struct myclass
{
    int member;
    constexpr myclass(int input): member(input) {}
    constexpr void f() {member = 42;} // Is it allowed?
};
Run Code Online (Sandbox Code Playgroud)

c++ constants member constexpr c++14

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

是否可以在声明后设置 constexpr 数组中元素的值?

是否可以constexpr在某一点声明一个 const 数组(可能),然后在另一个地方定义它,一次一个元素?

例如

extern constexpr int myArray[100];


myArray[0] = myConstexprFunction(0);
myArray[1] = myConstexprFunction(1);
// ...
myArray[100] = myConstexprFunction(100);
Run Code Online (Sandbox Code Playgroud)

我正在尝试做的将需要这样的东西。也许可以使用以下内容:http : //b.atch.se/posts/constexpr-counter/

但是如果这种技术在下一个 C++ 标准中是非法的(我希望不是),我想使用更安全的技术。

[编辑]放宽一些要求怎么样..假设我想做这样的事情:

constexpr int myConstExprFunction(int arg) { return arg + 100;}
// other code...
constexpr int a = myConstExprFunctionBegin(10);
constexpr int b = myConstExprFunction(20);
constexpr int c = myConstExprFunction(30);
constexpr int d = myConstExprFunctionEnd(40);
Run Code Online (Sandbox Code Playgroud)

我想要的是 myConstExprFunctionEnd 能够使用先前函数创建的值生成最终数组。当然,一切都在编译时。

[EDIT2] C++11 解决方案非常受欢迎

c++ arrays constexpr c++11

6
推荐指数
2
解决办法
1468
查看次数

有没有一种非间接,非破解的方法来保证constexpr函数只能在编译时调用?

目前,我们有两个主要的编译时评估选项:模板元编程(通常使用模板结构和/或变量)和constexpr操作1

template<int l, int r> struct sum_ { enum { value = l + r }; }; // With struct.
template<int l, int r> const int sum = sum_<l, r>::value;       // With struct & var.
template<int l, int r> const int sub = l - r;                   // With var.
constexpr int mul(int l, int r) { return l * r; }               // With constexpr.
Run Code Online (Sandbox Code Playgroud)

其中,我们保证可以在编译时对所有这四个值进行评估。

template<int> struct CompileTimeEvaluable {};

CompileTimeEvaluable<sum_<2, 2>::value> template_struct;                 // Valid.
CompileTimeEvaluable<sum<2, 2>> …
Run Code Online (Sandbox Code Playgroud)

c++ constexpr

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

是否有 strstr() 的 constexpr 版本?

据我了解,传统的字符数组的功能,如strlenstrstr等全部由C-标准定义,因为constexpr是C ++ 11,他们没有将其声明。

然而,在C ++ 17的std :: char_traits定义像一些同等功能的发现(这基本上是一个constexpr C ++的版本strchr,或复制这似乎提供类似的东西strcpy

但是没有find找到子字符串的变体,只有一个字符。那么是否有一些 C++ constexpr 相当于strstr标准的一部分?

c++ constexpr

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

带有 std::initializer_list 的奇怪行为 constexpr

我试图理解为什么编译器在这里抱怨:

// cexpr_test.cpp
#include <initializer_list>

constexpr int test_cexpr(std::initializer_list<const char*> x)
{
    return (int) (*x.begin())[0]; // ensuring the value isn't optimized out.
}

int main()
{
    constexpr int r1 = test_cexpr({ "why does this work," });

    constexpr std::initializer_list<const char*> broken { "but this doesn't?" };
    constexpr int r2 = test_cexpr(broken);

    return r1 + r2;
}
Run Code Online (Sandbox Code Playgroud)

编译时产生的消息

g++ -std=c++11 -Wall -Werror cexpr_test.cpp 
Run Code Online (Sandbox Code Playgroud)

如下:

cexpr_test.cpp:在函数“int main()”中:cexpr_test.cpp:12:76:错误:“const std::initializer_list{((const char* const*)(&)), 1}”不是常量表达式 12 | constexpr std::initializer_list 损坏 {“但这不是?” }; |

令人困惑的是,为什么它在没有任何问题的情况下构建第一个初始化列表。我在这里缺少什么?

c++ string-literals initializer-list language-lawyer constexpr

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

C++ 中的编译时 Base64 解码

是否可以在编译时将 base64 编码数据解码为二进制数据?

我想到了这样的事情:

constexpr auto decoded = decodeBase64<"SGVsbG8=">();

或者

constexpr auto decoded = decodeBase64("SGVsbG8=");

我对生成的decoded.

c++ compile-time constexpr c++17

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

gcc v10 和 v9 之间的 constexpr 区别:错误或功能

如果使用 gcc v10 编译,下面的代码会出现错误,但对于 gcc v9,代码没问题。

template<auto N>
struct A {
    constexpr auto size() const {
        return N;
    }  
};

template<typename T>
void foo1(const T& a) {
    constexpr auto s = a.size(); // Why error here?
}
template<typename T>
void foo2(T a) {
    constexpr auto s = a.size(); // OK
}
int main() {
    A<10> x1;
    foo1(x1);
    foo2(x1);
    A<x1.size()> x2; // OK
    constexpr auto s = x1.size(); // OK
}
Run Code Online (Sandbox Code Playgroud)

在我的理解中,成员函数 size() 在所有情况下都可以称为 constexpr。但是在一种情况下,与 gcc9 相比,gcc10 的行为发生了变化:如果参数由 const-ref 传递。我不明白为什么这不应该是 constexpr? …

c++ constant-expression constexpr

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

consteval 如何影响默认参数的评估?

在下面的代码中,如果here()停止consteval(完整 RT 或constexpr),则line()f()inside的调用行main()。但有了consteval它的定义f()。这种差异从何而来?

#include <experimental/source_location>
#include <iostream>

consteval std::experimental::source_location here(
    std::experimental::source_location loc = std::experimental::source_location::current())
{
   return loc;
}

void f(const std::experimental::source_location& a = here())
{
   std::cout << a.line() << std::endl; // will either print 17, or 10
}

int main()
{
   f();
}
Run Code Online (Sandbox Code Playgroud)

Godbolt 链接

c++ constexpr c++20 consteval

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

如何在编译时创建具有 string_views 序列的 constexpr 数组?

我想创建一个constexpr std::array<std::string_view, ConstexprNumber>. 例如,它应该包含constexpr std::strings_view's如下内容:

"text0", "text1", "text2", ..... "textn"

我想出了以下初始解决方案:

#include <iostream>
#include <array>
#include <utility>
#include <string>
#include <string_view>

// Number of strings that we want to generate
constexpr size_t NumberOfTextsToGenerate = 10u;

// constexpr function to build a string
constexpr std::string_view makeString(unsigned int i) {
    return std::string_view("text");
}

// Helper: constexpr function that will create an array of string_views and initialize it
template <unsigned int... ManyIntegers>
constexpr auto generateTextHelper(std::integer_sequence<unsigned int, ManyIntegers...>) {
    return …
Run Code Online (Sandbox Code Playgroud)

c++ arrays templates constexpr string-view

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

模板化的 constexpr 变量

我想确认这段代码是合法的(或不合法的?)C++17。

#include <iostream>

template<int N> inline constexpr float MyConst;

template<> inline constexpr float MyConst<1> = 1.1f;
template<> inline constexpr float MyConst<2> = 2.2f;

int main ()
{
    std::cout << MyConst<1> << '\n';

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果由g++MSVC编译,我不会得到错误(并得到正确的输出),

但是Intelclang给出了一个错误:

test.cpp(3): error: missing initializer for constexpr variable
  template<int N> inline constexpr float MyConst;
                         ^
Run Code Online (Sandbox Code Playgroud)

-std=c++17(/std:c++17对于 MSVC)编译。

在 Godbolt 和我的本地机器上尝试了最新的编译器。

c++ templates constexpr c++17

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