在 C++14 中,由于constexpr不再隐式const,constexpr成员函数可以修改类的数据成员:
struct myclass
{
int member;
constexpr myclass(int input): member(input) {}
constexpr void f() {member = 42;} // Is it allowed?
};
Run Code Online (Sandbox Code Playgroud) 是否可以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 解决方案非常受欢迎
目前,我们有两个主要的编译时评估选项:模板元编程(通常使用模板结构和/或变量)和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) 据我了解,传统的字符数组的功能,如strlen,strstr等全部由C-标准定义,因为constexpr是C ++ 11,他们没有将其声明。
然而,在C ++ 17的std :: char_traits定义像一些同等功能的发现(这基本上是一个constexpr C ++的版本strchr,或复制这似乎提供类似的东西strcpy。
但是没有find找到子字符串的变体,只有一个字符。那么是否有一些 C++ constexpr 相当于strstr标准的一部分?
我试图理解为什么编译器在这里抱怨:
// 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
是否可以在编译时将 base64 编码数据解码为二进制数据?
我想到了这样的事情:
constexpr auto decoded = decodeBase64<"SGVsbG8=">();
或者
constexpr auto decoded = decodeBase64("SGVsbG8=");
我对生成的decoded.
如果使用 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? …
在下面的代码中,如果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)
我想创建一个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++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编译,我不会得到错误(并得到正确的输出),
但是Intel和clang给出了一个错误:
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 和我的本地机器上尝试了最新的编译器。