constexpr相关内容
if constexpr() 和 if() 有什么区别? 我可以在何时何地同时使用它们? 解决方案 唯一的区别是 if constexpr 在编译时被评估,而 if 不是.这意味着分支可以在编译时被拒绝,因此永远不会被编译. 假设你有一个函数,length,它返回一个数字的长度,或者一个具有 .length() 函数的类型的长度.你不能在一个函数中做到,编译器会抱怨: tem
..
constexpr 和 const 有什么区别? 我什么时候可以只使用其中之一? 我什么时候可以同时使用两者,我应该如何选择一个? 解决方案 基本含义和语法 这两个关键字都可以用于对象和函数的声明.应用于对象时的基本区别是: const 将对象声明为 constant.这意味着保证一旦初始化,该对象的值就不会改变,并且编译器可以利用这一事实进行优化.它还有助于防止程序员
..
据我所知,constexpr 函数可以在编译时和运行时执行,这取决于整个评估是否可以在编译时完成. 但是,您不能重载此函数以获得运行时和编译时对应物. 所以我的问题是,如何放入运行时断言以确保运行时函数的执行与我的 static_assert 一起传递有效参数? 解决方案 Eric Niebler 在 C++11 中的 Assert 和 Constexpr,他指出在 C++11
..
我的库中有几个简短的 constexpr 函数可以执行一些简单的计算.我在运行时和编译时上下文中都使用它们. 我想在这些函数的主体中执行一些断言,但是 assert(...) 在 constexpr 函数和 static_assert 中无效(...) 不能用于检查函数参数. 示例: constexpr int getClamped(int mValue, int mMin, int
..
template内联 constexprT getClamped(const T& mValue, const T& mMin, const T& mMax){断言(mMin
..
我正在尝试使用给定函数在编译时填充二维数组.这是我的代码: template结构表{整数数据[H][W];//std::array, W>数据;//这不起作用constexpr 表():数据{}{for (int i = 0; i 它工作得很好,table.data 在编译时正确填充. 但是,如果我将普通二维数组 int[H][W] 更改为 std::array, W>, 我在循环体中
..
我目前正在创建一个带有 constexpr 构造函数的类,我想知道是否可以使用 std::array 来存储这个类的数据.标准是否明确指定 std::array 有一个 constexpr 构造函数,并且它的内容可以在编译时访问? 解决方案 因为 std::array 是一个聚合,所以可以初始化为一个 constexpr 当且仅当基础类型 T 具有 constexpr 构造函数(当与您提供
..
我从 c++11 开始,constexpr 和模板元编程似乎是在微型微控制器上节省稀缺内存的好方法. 有没有办法写一个模板来展平constexpr数组的列表,什么我需要的是一种方法: constexpr std::arraya1 = {1,2,3};constexpr std::arraya2 = {4,5};constexpr auto a3 = make_flattened_array
..
我正在尝试学习一些更现代的 C++ 实践,例如模板,我决定创建一个天真且简单的命令行参数解析器,它主要在编译时工作,但我已经遇到了 constexpr,基本上我想要做的就是在编译时检查重复条目(在运行时做这件事很简单). 首先,我有一个包含单一配置的结构: struct Arg_Opt_Tuple {std::string_view mc{};//多字符,即“帮助"字符 sc{};//单字
..
这是constexpr 静态转换的未定义行为从 int 到作用域枚举在 C++17 中编译为非固定基础类型(作用域 枚举的相同问题).TLDR 是作用域枚举始终具有固定的基础类型(默认情况下为 int,因此您始终可以从 int 转换为作用域枚举). 我想知道以下内容是否应该在 C++17 中编译 enum E{甲、乙};constexpr Ex = static_cast(2); 这在
..
我有一个类型 TimeDuration.现在它是 文字类型,我可以将它用作非类型模板范围.这种用法与类型定义相去甚远(在编译方面),因此如果有人修改 TimeDuration 使其不再是字面量,那么稍后就会注意到. 所以我把 static_assert(std::is_literal_type_v); 放在类定义之后.但是,is_literal_type 在 c++20 中被删除了.我可以用
..
我正在实现与 std::vector 非常相似的东西,但在堆栈上使用数组而不是内存分配. d-tor 调用使用 SFINAE 的函数. 如果 value_type 是 POD,则函数体为空. 如果value_type是std::string这样的普通类,则该函数有一个主体并正确销毁所有数据. 现在,我希望能够使用这个新的 std::vector 作为 constexpr.然而,
..
我正在尝试对可变参数模板使用递归.我希望基本情况具有零模板参数.在查看了之前问题的 stackoverflow 答案后,我发现了对这个问题的两种回应: 您不应专门化模板函数.Herb Sutter 在这里写道:http://www.gotw.ca/publications/mill17.htm 您使用模板 或 模板 .例如这里的第一个答案:如何编写可变参数模板递归函数? 我尝试在我的
..
如何在 constexpr 下创建函数? 这是我用来创建在"C"目录中定义的POD结构的函数.我无法更改的头文件. 我最终得到了下面的静态函数助手(可以工作)来制作这些结构,我相信它不是 constexpr ,因为 strncpy 调用违反了constexpr . 静态自动makeWPTEntry(const char *名称,double aLatDeg,double aLatMi
..
据说:std :: abs 不是标准中的 constexpr (即使在C ++ 20中也是如此).但是在实践中,我发现可以在该函数已模板化的非常特殊的条件下将其编译为 constexpr .请参阅此完全有效的示例: templateconstexpr T f(const T input){返回std :: abs(input);}int main(){int i = -1;
..
此程序: constexpr void f(){x:;} 由gcc编译,但clang表示: 错误:constexpr函数中不允许使用该语句 那么此代码有效吗? 解决方案 如
..
让我们假设我要编写一个包含成员constexpr std :: array的结构,该结构包含前N个小纤维,其中N是模板参数. 类似这样的东西,但是在编译时可以使用vals: 模板struct first_n_fibs {static_assert(N> 0);静态const std :: arrayvals;静态std :: arrayini
..
在 constexpr:简介中,发言者提到“编译时浮点计算可能与运行时计算的结果不同": 老实说,我不清楚.恕我直言,不同的平台也可能具有不同的整数实现. 为什么它只影响浮点数?还是我想念什么? 解决方案 在某种程度上,您绝对正确的是,在编译时计算浮点值的问题与计算整数值的问题相同.不同之处在于任务的复杂性.在具有16位寄存器的系统上模拟24位整数数学相当容易.对于认真的程序员来说
..
我试图理解为什么编译器在这里抱怨: //cexpr_test.cpp#includeconstexpr int test_cexpr(std :: initializer_list x){return(int)(* x.begin())[0];//确保未对值进行优化.}int main(){constexpr int r1 =
..
在C ++中,您可以将许多内容声明为 constexpr :变量,函数(包括成员函数和运算符),构造函数,以及自C ++ 1z起, if 语句和 lambda表达式.但是,声明析构函数 constexpr 会导致错误: struct X {constexpr〜X()=默认值;//错误:析构函数不能为'constexpr'}; 我的问题: 为什么不能将析构函数标记为 constexpr
..