constexpr 相关问题

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

为什么不能声明 constexpr 非静态数据成员?

尝试创建具有 constexpr 属性的结构成员而不是静态会导致编译器错误(见下文)。这是为什么?对于单个常量值,我会将这个值存储在内存中...

回答 1 投票 0

为什么这个 constexpr 静态成员函数在调用时不被视为 constexpr?

为什么这个constexpr静态成员函数,由//!标识不,评论,调用时没有被视为 constexpr? 结构 Item_id { 枚举 枚举 { 大小、位置、属性、window_...

回答 2 投票 0

不能使用嵌套类的constexpr函数

结构Foo { 结构栏 { 整数数据=0; //constexpr Bar() = 默认; // 也不起作用 constexpr Bar() : 数据(0) {} }; static constexpr Bar bar = {}; //

回答 2 投票 0

C++ - 无法使用嵌套类的 constexpr 函数

结构Foo { 结构栏 { 整数数据=0; //constexpr Bar() = 默认; // 也不起作用 constexpr Bar() : 数据(0) {} }; static constexpr Bar bar = {}; //

回答 1 投票 0

如何检查模板参数是否是2的幂?

我想创建一个静态分配 2^N 字节数组的结构,但我不希望该结构的用户指定这个大小作为指数。例子: 我的愚蠢数组 我想创建一个静态分配 2^N 字节数组的结构,但我不希望该结构的用户指定此大小作为指数。示例: my_stupid_array<char, 32> a1; // I want this! my_stupid_array<char, 5> a2; // And not this... 如何检查此模板参数是否为 2 的幂并通过一条不错的消息警告用户? 我已经能够使用一个简单的模板来检查这一点: template<int N> struct is_power_of_two { enum {val = (N >= 1) & !(N & (N - 1))}; }; 但是,我无法用理智的消息警告用户这一点。有什么想法吗? 编辑 修复了不明确的示例。 编辑 1确实是2的幂。解决了这个问题! :) 编辑 使用 BOOST_STATIC_ASSERT,我在使用 GCC 时收到此代码的编译错误: template<int N> struct is_power_of_two { enum {val = (N >= 1) & !(N & (N - 1))}; BOOST_STATIC_ASSERT(val); }; 错误 ..\main.cpp:29:1: error: invalid application of 'sizeof' to incomplete type 'boost::STATIC_ASSERTION_FAILURE<false>' http://ideone.com/cMfEf 编辑 哦,我明白了。这是断言失败时我应该收到的消息。但这未能给用户一些理智的信息。 :( 这些天,有了 constexpr 和 一些小小的技巧,你就可以 constexpr bool is_powerof2(int v) { return v && ((v & (v - 1)) == 0); } static_assert 来救援(仅限 C++11,对于 C++03 取消注释 BOOST_STATIC_ASSERT): #include<iostream> // #include <boost/static_assert.hpp> template<int N> struct is_power_of_two { enum {val = N && !(N & (N - 1))}; static_assert(val, "should use a power of 2 as template parameter"); // BOOST_STATIC_ASSERT(val); // without C++11 support, won't take a string message }; int main() { std::cout << is_power_of_two<2>::val << "\n"; std::cout << is_power_of_two<3>::val << "\n"; } C++11 的 Ideone 输出 C++03 的 Ideone 输出 更新1:其他想法(我知道你不想要这个,但对于大指数来说要容易得多): template<int N> make_power_of_two { enum { val = 1 << N }; }; my_stupid_array<char, make_power_of_two<5>::val > a1; // size 2^5 = 32 更新2:根据@sehe在聊天中的评论,您也可以对constexpr功能执行此操作 constexpr bool is_power_of_two(int x) { return x && ((x & (x-1)) == 0); } 您可以使用 static_assert 提供错误消息: template<int N> struct is_power_of_two { static_assert((N > 1) & !(N & (N - 1)), "Template parameter must be a power of two."); }; 我知道这是一个老问题,但我想根据上面的答案(谢谢你顺便说一句!)提出我刚刚使用的另一个选项以及 c++20 概念: template<auto V> constexpr bool is_power_of_two = V && ((V & (V - 1)) == 0); template<class T, auto SIZE> requires is_power_of_two<SIZE> using my_stupid_array = std::array<T, SIZE>; my_stupid_array<char, 32> a1; // FINE my_stupid_array<char, 5> a1; // COMPILER ERROR

回答 4 投票 0

GCC 接受 `constexpr struct {} s;` 但 Clang 拒绝它。谁是正确的? [重复]

以下代码可以使用 GCC 正常编译: constexpr struct {} s; 但 Clang 拒绝了它,并出现以下错误: 错误:const 类型“const struct”对象的默认初始化(匿名

回答 1 投票 0

在 C++11 中创建 N 元素 constexpr 数组

你好,我正在学习 C++11,我想知道如何制作 constexpr 0 到 n 数组,例如: n = 5; int array[] = {0 ... n}; 所以数组可能是 {0, 1, 2, 3, 4, 5}

回答 10 投票 0

如何在C++编译时检测const char*格式错误?

我正在尝试编写一个函数“my_func()”,该函数在编译时计算字符串中“a”的字符数,这使得当计算“a&q...”时代码无法编译。

回答 1 投票 0

为什么 constexpr 函数中的引用参数不是常量表达式?

考虑以下函数: 模板 自动连接(const std::array &data1, const std::array &dat...

回答 3 投票 0

如何强制 constexpr 函数进行常量求值? [重复]

我最近编写了一些代码,将函数结果打印到cout。结果本可以在编译时评估,但事实并非如此: #包括 #包括 常量表达式

回答 1 投票 0

std::is_constant_evaluated() 和 const 变量

让我们考虑以下代码: #包括 int foo(int arg) { if (std::is_constant_evaluated()) { 返回1; } 别的 { 返回0; } } int main() { ...

回答 2 投票 0

为什么 constexpr 看起来并不意味着 char* 为 const?

很明显 constexpr 意味着 const,因此很常见: constexpr int foo = 42; // 这里没有const 但是如果你写: constexpr char *const str = "foo"; 然后 GCC 将产生“

回答 3 投票 0

C++20 | std::is_constant_evaluated() 和 const 变量

让我们考虑以下代码: #包括 int foo(int arg) { if (std::is_constant_evaluated()) { 返回1; } 别的 { 返回0; } } int main() { ...

回答 2 投票 0

定义中所述的假设上下文中的核心常量表达式

参考:constexpr 说明符 (C++11 起) 常量表达式变量 constexpr 变量必须满足以下要求: ... 它必须不断遭到破坏,即: 这是类类型...

回答 1 投票 0

派生类中的 constexpr 可以在不实例化任何类的情况下初始化基类成员吗?

我有一些通用功能,我只想在基类中实现一次。我有许多(许多!)不同的案例具有相同的结构但不同的数据,此功能在这些案例上......

回答 1 投票 0

传递 constexpr 成员作为引用会在调试或 -O1 模式下触发 gcc 的链接器错误

下面的代码会触发 gcc '未定义的引用 Foo::d' 和 '未定义的引用 Foo::i' 错误。奇怪的是,只有当我在 -Og 或 -O1 优化模式下编译它时才会发生这种情况,但如果使用 -O2 o 则不会......

回答 1 投票 0

你可以在 constexpr 函数中取消引用shared_ptr吗?

我试图将shared_ptr传递到模板化函数中并在该函数内取消引用它。前任: constexpr bool 测试(std::shared_ptr&val) const { 返回 val->some_bool; }

回答 1 投票 0

C++ 中的 constexpr 是什么? [重复]

我对 constexpr 概念真的很困惑,因为我读过 constexpr 在编译时评估,因此与普通 const 相比,它对于性能优化很有用。 constexpr int i = 0; 康斯特...

回答 4 投票 0

static const 和 constexpr 变量有什么区别? [重复]

我知道 constexpr 变量可以在编译时使用。 例如,对于模板或静态断言器。 但如果我想在没有 constexpr 的情况下做到这一点,我可以使用 static const。 自从...

回答 1 投票 0

为什么我不能在 C++11 中使用 constexpr 数据成员指针作为模板参数?

请考虑以下代码: 模板 结构 H {}; 结构 AA { int i; }; int main() { typedef int AA::*PI; constexpr PI pi = &AA::i; H&...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.