问题标签 [consteval]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
295 浏览

c++ - 非文字类型和常量表达式

https://godbolt.org/z/4KPY5P7o7

该程序被 ICC、GCC 和 Clang 接受,但被 MSVC 拒绝,它抱怨析构函数不在constexpr立即函数调用中。

添加标记的行会//1导致所有四个编译器都拒绝该代码。


问题:无论哪种情况,编译器是否正确,如果正确,为什么?


请注意,这里有趣的部分是由于非平凡的析构函数A而导致的非文字部分。constexpr删除它的声明,所有编译器都接受带和不带的变体//1

constexpr/函数和常量表达式的非文字类型有一些特定的限制consteval,但我认为它们中的任何一个都不应该适用于此。限制是返回类型、参数类型、局部变量定义的类型、右值到左值的转换和对象的修改。我想只有最后一个可以在这里申请。但是[expr.const]/5.16中的修改究竟是什么意思,这里会修改哪个对象?

我还认为 MSVC 的抱怨是不正确的,因为对象的破坏不应该是其构造函数立即调用的一部分。

另请参阅我之前的启发这个问题的问题:Consteval constructor and member function calls in constexpr functions

0 投票
1 回答
100 浏览

c++ - consteval lambda 中的非“constexpr”函数 std::to_string(int)

std::to_string()在以下 lambda 函数中遇到问题:

上面的代码不能在我的GCC v11.2上编译,因此我必须在编译器资源管理器中使用GCC(主干)来编译它。

但是,仅取消注释对它的调用std::to_string()不会编译:

在不久的将来某个时候会std::to_string用STL 制作吗?constexpr还是我应该寻找另一种方法来做到这一点?有什么替代方法std::to_string

0 投票
1 回答
179 浏览

c++ - 可以在 C++ 的堆上创建具有 consteval 构造函数的类吗?

在下面的代码struct A中具有立即函数默认构造函数,并且在动态内存中创建结构的对象是指new A{}

只有 Clang 接受它。

海合会抱怨

MSVC 也是如此:

演示:https ://gcc.godbolt.org/z/6Px5WYGzd

哪个编译器在这里?

0 投票
0 回答
357 浏览

c++ - 在 constexpr 上下文中使用 consteval 构造函数的新表达式

https://godbolt.org/z/jsq35WxKs

GCC 和 MSVC 拒绝该程序,ICC 和 Clang 接受它:

虽然,替换new Anew A()导致 GCC 也接受该程序(但两者都不new A{}是)。


至少进行以下更改之一会导致所有四个编译器都接受该程序:

  1. 替换constevalconstexpr

  2. 替换constexprconsteval

  3. 代替

    A a;, 有auto&& a = A{};或 有A{};

只有例外:

  • 带有 libstdc++ 的 Clang 主干std::allocator似乎由于不相关的错误而无法使用该版本进行编译。对于 Clang 13 或 libc++,它也被接受。

  • std::allocator只要consteval构造函数上有, MSVC 就会拒绝该版本:

完全替换或删除调用似乎static_assert(g());g()这些结果没有任何影响。


哪些编译器是正确的,如果原始编译器格式不正确,为什么只不允许使用限定符和构造方法的特定组合?


受到此答案下的评论的启发。

0 投票
2 回答
153 浏览

c++ - 为什么我们不能在 consteval 函数中使用编译时“变量”作为模板参数?

我正在测试这段代码(https://godbolt.org/z/fe6hhbeqW)......

我对它不起作用感到困惑。GCC 和 clang 同意i不是一个常量表达式,所以他们拒绝让我将它作为模板参数传递。但是,i在编译时就清楚地知道了,因此,据我所知,编译器使用它来实例化模板应该没有任何问题。

有没有理由不工作?将来会起作用吗?我已经用两个编译器的主干版本进行了测试,结果相同。

0 投票
1 回答
84 浏览

c++ - consteval 构造函数必须初始化所有数据成员吗?

在下一个程序struct B中有立即consteval默认构造函数,它不初始化i字段。然后这个构造函数被用来做一个临时的,它的i字段保持不变:

Clang 和 MSVC 都可以。但 GCC 抱怨:

演示:https ://gcc.godbolt.org/z/x4n6ezrhT

哪个编译器在这里?

0 投票
0 回答
42 浏览

c++ - 比较 constexpr 中的 void 指针

在 C++ 中:

  1. void*无需强制转换即可将指针转换为
  2. 只要您不取消引用它们,就可以使用 1-past-end 指针
  3. 即使指针指向不相关的对象,也可以将指针与==它们进行比较。!=

在那种情况下,为什么编译失败:

铿锵声 说:

GCC 说:

两者都不是特别有用。据我所知,这里不涉及 UB。有没有办法在不扰乱编译器的情况下比较这些指针是否相等?

0 投票
2 回答
53 浏览

c++ - 是否可以传递对 consteval 函数的引用并将其用作附加返回值?

有时函数的结果不能用单个返回值来表示。例如:与两条线相交的函数。人们可能希望函数返回实际的交点以及它们之间的关系(即平行、相同、相交或倾斜)。

让我们假设这个例子,其中交点由某种类表示,线的位置关系由一个整数表示,整数为 4 种可能性中的每一种都保存一个指定的值:

这就是我今天实现它的方式,但现在我想知道是否有可能有一个类似的实现,但有一个 consteval 函数。Line并且Point有 constexpr 构造函数和一切,计算本身也可以在编译时进行评估。唯一的问题是我想不出有两个返回值的方法。我已经想到了,std::pair但更类似于传递引用的解决方案将是首选。如果不存在这样的解决方案,我将不得不退回到std::pair.

point通过引用 ( )传递不起作用,Point& point因为“表达式没有计算为常量”,但通过 const 引用 ( const Point& point) 传递也不起作用,因为我无法将结果分配给point. 有没有办法让这个工作?