constexpr相关内容

“if constexpr()"之间的区别与“if()"

if constexpr() 和 if() 有什么区别? 我可以在何时何地同时使用它们? 解决方案 唯一的区别是 if constexpr 在编译时被评估,而 if 不是.这意味着分支可以在编译时被拒绝,因此永远不会被编译. 假设你有一个函数,length,它返回一个数字的长度,或者一个具有 .length() 函数的类型的长度.你不能在一个函数中做到,编译器会抱怨: tem ..
发布时间:2021-12-12 13:11:21 C/C++开发

`constexpr` 和 `const` 之间的区别

constexpr 和 const 有什么区别? 我什么时候可以只使用其中之一? 我什么时候可以同时使用两者,我应该如何选择一个? 解决方案 基本含义和语法 这两个关键字都可以用于对象和函数的声明.应用于对象时的基本区别是: const 将对象声明为 constant.这意味着保证一旦初始化,该对象的值就不会改变,并且编译器可以利用这一事实进行优化.它还有助于防止程序员 ..
发布时间:2021-12-01 15:22:51 C/C++开发

如何在 constexpr 函数中执行运行时断言?

据我所知,constexpr 函数可以在编译时和运行时执行,这取决于整个评估是否可以在编译时完成. 但是,您不能重载此函数以获得运行时和编译时对应物. 所以我的问题是,如何放入运行时断言以确保运行时函数的执行与我的 static_assert 一起传递有效参数? 解决方案 Eric Niebler 在 C++11 中的 Assert 和 Constexpr,他指出在 C++11 ..
发布时间:2021-11-30 11:42:56 C/C++开发

如何在 C++ 中将 static_assert 用于 constexpr 函数参数?

我的库中有几个简短的 constexpr 函数可以执行一些简单的计算.我在运行时和编译时上下文中都使用它们. 我想在这些函数的主体中执行一些断言,但是 assert(...) 在 constexpr 函数和 static_assert 中无效(...) 不能用于检查函数参数. 示例: constexpr int getClamped(int mValue, int mMin, int ..
发布时间:2021-11-30 11:28:48 C/C++开发

为什么非常量 std::array::operator[] 不是 constexpr?

我正在尝试使用给定函数在编译时填充二维数组.这是我的代码: template结构表{整数数据[H][W];//std::array, W>数据;//这不起作用constexpr 表():数据{}{for (int i = 0; i 它工作得很好,table.data 在编译时正确填充. 但是,如果我将普通二维数组 int[H][W] 更改为 std::array, W>, 我在循环体中 ..
发布时间:2021-11-18 05:03:04 C/C++开发

可以在 constexpr 类中使用 std::array 吗?

我目前正在创建一个带有 constexpr 构造函数的类,我想知道是否可以使用 std::array 来存储这个类的数据.标准是否明确指定 std::array 有一个 constexpr 构造函数,并且它的内容可以在编译时访问? 解决方案 因为 std::array 是一个聚合,所以可以初始化为一个 constexpr 当且仅当基础类型 T 具有 constexpr 构造函数(当与您提供 ..
发布时间:2021-11-18 04:20:29 C/C++开发

在编译时查找数组中的重复项

我正在尝试学习一些更现代的 C++ 实践,例如模板,我决定创建一个天真且简单的命令行参数解析器,它主要在编译时工作,但我已经遇到了 constexpr,基本上我想要做的就是在编译时检查重复条目(在运行时做这件事很简单). 首先,我有一个包含单一配置的结构: struct Arg_Opt_Tuple {std::string_view mc{};//多字符,即“帮助"字符 sc{};//单字 ..
发布时间:2021-09-16 18:58:59 C/C++开发

在 C++17 中编译的 constexpr 从 int 到 unscoped enum 的未定义行为与非固定基础类型编译

这是constexpr 静态转换的未定义行为从 int 到作用域枚举在 C++17 中编译为非固定基础类型(作用域 枚举的相同问题).TLDR 是作用域枚举始终具有固定的基础类型(默认情况下为 int,因此您始终可以从 int 转换为作用域枚举). 我想知道以下内容是否应该在 C++17 中编译 enum E{甲、乙};constexpr Ex = static_cast(2); 这在 ..
发布时间:2021-09-13 20:42:03 C/C++开发

如何静态断言该类型对于 c++20 中的模板非类型参数是可行的

我有一个类型 TimeDuration.现在它是 文字类型,我可以将它用作非类型模板范围.这种用法与类型定义相去甚远(在编译方面),因此如果有人修改 TimeDuration 使其不再是字面量,那么稍后就会注意到. 所以我把 static_assert(std::is_literal_type_v); 放在类定义之后.但是,is_literal_type 在 c++20 中被删除了.我可以用 ..
发布时间:2021-09-04 20:45:36 C/C++开发

sfinae 远离一个破坏者

我正在实现与 std::vector 非常相似的东西,但在堆栈上使用数组而不是内存分配. d-tor 调用使用 SFINAE 的函数. 如果 value_type 是 POD,则函数体为空. 如果value_type是std::string这样的普通类,则该函数有一个主体并正确销毁所有数据. 现在,我希望能够使用这个新的 std::vector 作为 constexpr.然而, ..
发布时间:2021-07-23 19:45:14 C/C++开发

为没有模板参数的可变模板递归创建基本情况

我正在尝试对可变参数模板使用递归.我希望基本情况具有零模板参数.在查看了之前问题的 stackoverflow 答案后,我发现了对这个问题的两种回应: 您不应专门化模板函数.Herb Sutter 在这里写道:http://www.gotw.ca/publications/mill17.htm 您使用模板 或 模板 .例如这里的第一个答案:如何编写可变参数模板递归函数? 我尝试在我的 ..

具有char []字段的POD结构的constexpr构造

如何在 constexpr 下创建函数? 这是我用来创建在"C"目录中定义的POD结构的函数.我无法更改的头文件. 我最终得到了下面的静态函数助手(可以工作)来制作这些结构,我相信它不是 constexpr ,因为 strncpy 调用违反了constexpr . 静态自动makeWPTEntry(const char *名称,double aLatDeg,double aLatMi ..
发布时间:2021-04-24 19:17:29 C/C++开发

为什么编译时浮点计算的结果可能与运行时计算的结果不同?

在 constexpr:简介中,发言者提到“编译时浮点计算可能与运行时计算的结果不同": 老实说,我不清楚.恕我直言,不同的平台也可能具有不同的整数实现. 为什么它只影响浮点数?还是我想念什么? 解决方案 在某种程度上,您绝对正确的是,在编译时计算浮点值的问题与计算整数值的问题相同.不同之处在于任务的复杂性.在具有16位寄存器的系统上模拟24位整数数学相当容易.对于认真的程序员来说 ..

为什么不能将析构函数标记为constexpr?

在C ++中,您可以将许多内容声明为 constexpr :变量,函数(包括成员函数和运算符),构造函数,以及自C ++ 1z起, if 语句和 lambda表达式.但是,声明析构函数 constexpr 会导致错误: struct X {constexpr〜X()=默认值;//错误:析构函数不能为'constexpr'}; 我的问题: 为什么不能将析构函数标记为 constexpr ..
发布时间:2021-04-24 19:17:04 C/C++开发