Questions tagged «constexpr»

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

2
为什么C ++ 20之前std :: swap没有标记为constexpr?
在C ++ 20中,std::swap成为一个constexpr函数。 我知道标准库在标记事物方面确实落后于该语言constexpr,但是到了2017年,<algorithm>它和许多其他事物一样已经成为constexpr了。但是- std::swap不是。我隐约记得有一些奇怪的语言缺陷阻止了这种标记,但是我忘记了细节。 有人可以简洁明了地解释吗? 动机:需要理解为什么在C ++ 11 / C ++ 14代码中标记std::swap()类似函数的想法可能不是一个好主意constexpr。

1
__func__指针的两个constexpr实例的区别是否仍然是constexpr?
这是有效的C ++吗? int main() { constexpr auto sz = __func__ - __func__; return sz; } GCC和MSVC认为可以,而Clang认为不可以:Compiler Explorer。 所有编译器都同意这是可以的:Compiler Explorer。 int main() { constexpr auto p = __func__; constexpr auto p2 = p; constexpr auto sz = p2 - p; return sz; } Clang再次不喜欢这个,但是其他的都可以:Compiler Explorer int main() { constexpr auto p …

2
如何快速评估const expr
我一直在尝试在编译时求值的const表达式。但是我玩了一个在编译时执行起来似乎很快的示例。 #include<iostream> constexpr long int fib(int n) { return (n <= 1)? n : fib(n-1) + fib(n-2); } int main () { long int res = fib(45); std::cout << res; return 0; } 当我运行此代码时,大约需要7秒钟才能运行。到目前为止,一切都很好。但是当我切换long int res = fib(45)到const long int res = fib(45)它时,甚至不需要一秒钟。据我了解,它是在编译时评估的。 但是编译大约需要0.3秒 编译器如何如此迅速地进行评估,但是在运行时却要花费更多的时间?我正在使用gcc 5.4.0。
13 c++  const  constexpr 


1
可以是constexpr吗?
所有std :: span的构造函数都声明为constexpr,但是我似乎无法在constexpr上下文中使用它们中的任何一个。取消注释以下任何constexpr都将导致编译错误。 #include <array> #include <span> int main() { constexpr int carray[3] = { 0, 1, 2 }; constexpr std::array<int, 3> array{ 0, 1, 2 }; using S = std::span<const int, 3>; /*constexpr*/ S span1{ array.data(), 3 }; /*constexpr*/ S span2{array.begin(), array.end()}; /*constexpr*/ S span3{carray}; /*constexpr*/ S span4{array}; } …
11 c++  constexpr  c++20 

1
GCC无法报告格式错误的constexpr lambda调用
以下是两个未定义行为的测试用例,表示为IIFE(即所谓的Lambda-Axpression): constexpr auto test3 = []{ int* p{}; { int x{}; p = &x; } return *p; // Undefined Behaviour }(); // IIFE constexpr auto test4 = []{ int x = std::numeric_limits<int>::min(); int y = -x; // Undefined Behaviour return y; }(); int main() {} 使用GCC主干编译时,test4由于它在中显示出Undefined Behavior ,因此被正确拒绝constexpr。另一方面test3被接受。 GCC有权接受test3吗?
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.