问题标签 [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.
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
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
?
c++ - 可以在 C++ 的堆上创建具有 consteval 构造函数的类吗?
在下面的代码struct A
中具有立即函数默认构造函数,并且在动态内存中创建结构的对象是指new A{}
:
只有 Clang 接受它。
海合会抱怨
MSVC 也是如此:
演示:https ://gcc.godbolt.org/z/6Px5WYGzd
哪个编译器在这里?
c++ - 在 constexpr 上下文中使用 consteval 构造函数的新表达式
https://godbolt.org/z/jsq35WxKs
GCC 和 MSVC 拒绝该程序,ICC 和 Clang 接受它:
虽然,替换new A
为new A()
导致 GCC 也接受该程序(但两者都不new A{}
是)。
至少进行以下更改之一会导致所有四个编译器都接受该程序:
替换
consteval
为constexpr
替换
constexpr
为consteval
代替
和
有
A a;
, 有auto&& a = A{};
或 有A{};
只有例外:
带有 libstdc++ 的 Clang 主干
std::allocator
似乎由于不相关的错误而无法使用该版本进行编译。对于 Clang 13 或 libc++,它也被接受。std::allocator
只要consteval
构造函数上有, MSVC 就会拒绝该版本:
完全替换或删除调用似乎static_assert(g());
对g()
这些结果没有任何影响。
哪些编译器是正确的,如果原始编译器格式不正确,为什么只不允许使用限定符和构造方法的特定组合?
受到此答案下的评论的启发。
c++ - 为什么我们不能在 consteval 函数中使用编译时“变量”作为模板参数?
我正在测试这段代码(https://godbolt.org/z/fe6hhbeqW)......
我对它不起作用感到困惑。GCC 和 clang 同意i
不是一个常量表达式,所以他们拒绝让我将它作为模板参数传递。但是,i
在编译时就清楚地知道了,因此,据我所知,编译器使用它来实例化模板应该没有任何问题。
有没有理由不工作?将来会起作用吗?我已经用两个编译器的主干版本进行了测试,结果相同。
c++ - consteval 构造函数必须初始化所有数据成员吗?
在下一个程序struct B
中有立即consteval
默认构造函数,它不初始化i
字段。然后这个构造函数被用来做一个临时的,它的i
字段保持不变:
Clang 和 MSVC 都可以。但 GCC 抱怨:
演示:https ://gcc.godbolt.org/z/x4n6ezrhT
哪个编译器在这里?
c++ - 比较 constexpr 中的 void 指针
在 C++ 中:
void*
无需强制转换即可将指针转换为- 只要您不取消引用它们,就可以使用 1-past-end 指针
- 即使指针指向不相关的对象,也可以将指针与
==
它们进行比较。!=
在那种情况下,为什么编译失败:
铿锵声 说:
GCC 说:
两者都不是特别有用。据我所知,这里不涉及 UB。有没有办法在不扰乱编译器的情况下比较这些指针是否相等?
c++ - 是否可以传递对 consteval 函数的引用并将其用作附加返回值?
有时函数的结果不能用单个返回值来表示。例如:与两条线相交的函数。人们可能希望函数返回实际的交点以及它们之间的关系(即平行、相同、相交或倾斜)。
让我们假设这个例子,其中交点由某种类表示,线的位置关系由一个整数表示,整数为 4 种可能性中的每一种都保存一个指定的值:
这就是我今天实现它的方式,但现在我想知道是否有可能有一个类似的实现,但有一个 consteval 函数。Line
并且Point
有 constexpr 构造函数和一切,计算本身也可以在编译时进行评估。唯一的问题是我想不出有两个返回值的方法。我已经想到了,std::pair
但更类似于传递引用的解决方案将是首选。如果不存在这样的解决方案,我将不得不退回到std::pair
.
point
通过引用 ( )传递不起作用,Point& point
因为“表达式没有计算为常量”,但通过 const 引用 ( const Point& point
) 传递也不起作用,因为我无法将结果分配给point
. 有没有办法让这个工作?