Questions tagged «constexpr»

constexpr是C ++ 11中引入的修饰符,它通知编译器函数或变量的值是已知的或可以在编译时计算。因此,它可以在其他情况下不能用作常量。


14
什么时候应该在C ++ 11中使用constexpr功能?
在我看来,拥有“总是返回5的函数”正在破坏或削弱“调用函数”的含义。一定有原因或需要此功能,否则C ++ 11中不会存在。为什么在那儿? // preprocessor. #define MEANING_OF_LIFE 42 // constants: const int MeaningOfLife = 42; // constexpr-function: constexpr int MeaningOfLife () { return 42; } 在我看来,如果我编写了一个返回文字值的函数,并且进行了代码审查,则有人会告诉我,我应该声明一个常量值,而不是编写return 5。
337 c++  c++11  constexpr 


2
函数中的静态constexpr变量有意义吗?
如果我在函数中有一个变量(例如,一个大数组),则将其声明为static和constexpr是否有意义?constexpr保证数组是在编译时创建的,那static会没用吗? void f() { static constexpr int x [] = { // a few thousand elements }; // do something with the array } static根据生成的代码或语义,实际上在做什么?
192 c++  static  c++11  constexpr 

6
对静态constexpr char []的未定义引用
我想static const char在班上有一个数组。GCC抱怨并告诉我应该使用constexpr,尽管现在它告诉我这是未定义的参考。如果我将数组设为非成员,则它将进行编译。到底是怎么回事? // .hpp struct foo { void bar(); static constexpr char baz[] = "quz"; }; // .cpp void foo::bar() { std::string str(baz); // undefined reference to baz }

4
可以在constexpr中使用std :: string吗?
使用C ++ 11,Ubuntu 14.04和GCC默认工具链。 此代码失败: constexpr std::string constString = "constString"; 错误:constexpr变量'constString'的类型'const string {aka const std :: basic_string}'不是字面量...因为...'std :: basic_string'具有非平凡的析构函数 是否有可能使用std::string的constexpr?(显然不是...)如果是这样,怎么办?有没有在字符串中使用字符串的替代方法constexpr?

2
constexpr暗示内联吗?
考虑以下内联函数: // Inline specifier version #include<iostream> #include<cstdlib> inline int f(const int x); inline int f(const int x) { return 2*x; } int main(int argc, char* argv[]) { return f(std::atoi(argv[1])); } 和constexpr等效版本: // Constexpr specifier version #include<iostream> #include<cstdlib> constexpr int f(const int x); constexpr int f(const int x) { return 2*x; …

2
在C ++中“毒害函数”是什么意思?
在斯科特·舒尔(Scott Schurr)在CppCon上的演讲“介绍constexpr”结束时,他问“有没有办法毒害某个功能”?然后,他解释说可以通过以下方式(尽管以非标准方式)完成此操作: 把一个throw在constexpr功能 宣布未解决 extern const char* 引用未解决extern的throw 我感觉自己在这里有些深奥,但我很好奇: “使功能中毒”是什么意思? 他概述的技术的意义/用处是什么?
96 c++  constexpr 

6
在编译时计算C字符串的长度。这真的是constexpr吗?
我正在尝试在编译时计算字符串文字的长度。为此,我使用以下代码: #include <cstdio> int constexpr length(const char* str) { return *str ? 1 + length(str + 1) : 0; } int main() { printf("%d %d", length("abcd"), length("abcdefgh")); } 一切正常,程序输出4和8。clang生成的汇编代码表明结果是在编译时计算的: 0x100000f5e: leaq 0x35(%rip), %rdi ; "%d %d" 0x100000f65: movl $0x4, %esi 0x100000f6a: movl $0x8, %edx 0x100000f6f: xorl %eax, %eax 0x100000f71: callq …

3
Constexpr与宏
我应该在哪里使用宏,哪里应该使用constexpr?它们不是基本相同吗? #define MAX_HEIGHT 720 与 constexpr unsigned int max_height = 720;
92 c++  c++11  macros  constexpr 

6
枚举vs constexpr用于类内部的实际静态常量
让我首先说明我的意图。在较早的(C ++)时代,我们将有如下代码: class C { public: enum {SOME_VALUE=27}; }; 然后,我们可以SOME_VALUE在整个代码中将其用作编译时间常数,并且无论编译器看到什么C::SOME_VALUE,它都只会插入文字27。 现在,将代码更改为以下内容似乎是可以接受的: class C { public: static constexpr int SOME_VALUE=27; }; SOME_VALUE从C ++ 11开始,这看起来更加简洁,给出了定义良好的类型,似乎是首选方法。(至少对我来说是SOME_VALUE无法预料的)问题是,这还会导致需要将其置于外部的情况。也就是说,在某些cpp文件中,我们需要添加: constexpr int C::SOME_VALUE; // Now C::SOME_VALUE has external linkage 导致这种情况的原因似乎是在使用const引用时SOME_VALUE,这种情况在C ++标准库代码中经常发生(请参阅此问题底部的示例)。顺便说一下,我正在使用gcc 4.7.2作为我的编译器。 由于这一难题,我不得不回到定义SOME_VALUE为枚举(即旧派)的方式,以避免为某些但不是全部静态constexpr成员变量向cpp文件中添加定义。难道没有什么办法告诉编译器这constexpr int SOME_VALUE=27意味着SOME_VALUE应该仅将其视为编译时常数,而不应将其视为具有外部链接的对象吗?如果看到与它一起使用的const引用,请创建一个临时引用。如果您看到它的地址,那么就需要生成一个编译时错误,因为这是一个编译时间常数,仅此而已。 以下是一些看似良性的示例代码,这些代码使我们需要SOME_VALUE在cpp文件中添加的定义(再次,用gcc 4.7.2测试): #include <vector> class C { public: static constexpr int SOME_VALUE=5; …
69 c++  c++11  constexpr 

3
如何在编译时获取多维std :: vector的深度?
我有一个函数,需要一个多维参数std::vector,需要将深度(或维数)作为模板参数传递。与其对这个值​​进行硬编码,我想编写一个constexpr函数,该函数将std::vector并将深度作为unsigned integer值返回。 例如: std::vector<std::vector<std::vector<int>>> v = { { { 0, 1}, { 2, 3 } }, { { 4, 5}, { 6, 7 } }, }; // Returns 3 size_t depth = GetDepth(v); 不过,这需要在编译时完成,因为此深度将作为模板参数传递给模板函数: // Same as calling foo<3>(v); foo<GetDepth(v)>(v); 有什么办法吗?

1
回顾C ++编译时间计数器
TL; DR 在尝试阅读整篇文章之前,请了解: 我自己已经找到解决所提出问题的方法,但是我仍然很想知道分析是否正确; 我已经将解决​​方案打包到一个fameta::counter类中,该类可以解决一些剩余的怪癖。您可以在github上找到它; 您可以在使用Godbolt上看到它。 一切如何开始 自从FilipRoséen在2015年发现/发明以来,编译计时器的黑魔法就用C ++了,我一直对这个设备有些痴迷,所以当CWG 决定必须取消功能时,我很失望,但仍然希望他们的想法通过向他们展示一些引人注目的用例可以对其进行更改。 然后,几年前,我决定再次研究一下问题,以便将uberswitch es嵌套(在我看来,这是一个有趣的用例),只是发现它不再适用于新版本的。可用的编译器,即使问题2118处于(并且仍然)处于打开状态:代码可以编译,但计数器不会增加。 在Roséen的网站上已经报告了该问题,最近在stackoverflow上也报告了该问题:C ++是否支持编译时计数器? 几天前,我决定再次尝试解决问题 我想了解编译器中发生了什么变化,这些变化使看似仍然有效的C ++不再起作用。为此,我在互联网上进行了广泛的搜索,寻找有人对此进行讨论,但无济于事。因此,我开始进行实验并得出一些结论,我在这里提出的想法是希望从这里得到比我自己更了解的反馈。 为了清楚起见,下面我将介绍Roséen的原始代码。有关其工作原理的说明,请访问他的网站: template<int N> struct flag { friend constexpr int adl_flag (flag<N>); }; template<int N> struct writer { friend constexpr int adl_flag (flag<N>) { return N; } static constexpr int value = N; }; …

1
任何用constexpr string_view替换全局const char []的陷阱吗?
我们的团队正在使用具有10多年历史的C ++代码库,并且最近切换到了C ++ 17编译器。因此,我们正在寻找使代码现代化的方法。在YouTube的一次会议演讲中,我听到了用替换const char*全局字符串的建议constexpr string_view。 由于我们的代码中有很多这样的const char*全局字符串常量,因此我想问一下是否需要了解一些陷阱或潜在问题?

1
std :: pair <自动,自动>返回类型
我玩弄auto在std::pair。在下面的代码中,函数f应该返回std::pair依赖于模板参数的类型的。 一个工作示例: 例1 template &lt;unsigned S&gt; auto f() { if constexpr (S == 1) return std::pair{1, 2}; // pair of ints else if constexpr (S == 2) return std::pair{1.0, 2.0}; // pair of doubles else return std::pair{0.0f, 0.0f}; // pair of floats } 这适用于gcc 9.2,gcc 10.0,clang 9.0和clang 10.0。 接下来,std::pair出于清楚的原因,我想显式地将返回类型编写为: 例子2 …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.