问题标签 [if-constexpr]

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 投票
0 回答
111 浏览

c++ - 如果 constexpr gcc 错误

我注意到我的代码库不再使用 gcc 编译。

我能够将问题减少到以下问题

https://godbolt.org/z/ateuYW

clang 和 msvc 正在编译代码没有问题。

更改truetoif constexprfalsegcc 将编译它。

我假设 gcc 没有完全解析导致奇怪错误的错误部分。

所以我的问题:

  1. 代码是有效的 c++ 还是我错过了什么?
  2. 我应该针对 gcc 提交错误吗?(我无法找到有关此问题的错误报告)
0 投票
1 回答
291 浏览

c++ - if constexpr 内部的 requires 子句有问题

在尝试if constexpr基于if constexpr 和 requires-expression 实现临时概念检查时,面临以下问题:requires clause

有什么问题if constexpr requires clause

0 投票
1 回答
87 浏览

c++ - 如何防止 std::is_constructible 中的隐式转换

比方说,我有几个不同的课程:

然后我想根据它们可构造的类型(简化示例)做一些事情:

但问题是,所有这些都返回1

在此处输入图像描述

我知道这种行为的原因是类型之间的隐式转换。是否有一种合法的(至少可用于三个主要编译器:msvcgccclang的方式来强制编译器区分这些类型。

我不允许更改课程(constructible_from_float等),但可以做其他所有事情。稳定版本的编译器提供的任何东西都可以(包括c++2a)。

0 投票
0 回答
35 浏览

c++ - 如果 constexpr 在将值作为参数传递时失败,而不是在作为模板传递时失败

我有一些看起来像这样的代码

我期待能够if constexpr在 takeparam 函数中使用,但我无法让它工作。我究竟做错了什么?

0 投票
1 回答
528 浏览

visual-studio - c++17 语言扩展和 std:c++17 标志

我对 Visual Studio 2017(版本 15.9.11)中的不同错误感到困惑:

我知道添加 /std:c++17 标志可以解决这些问题,但为什么会有两条不同的消息?语言扩展和编译器标志要求有什么区别?

我对这件事更感兴趣,因为我正在使用 Unreal Engine 4.24 编写游戏,我可以使用“if constexpr”,但即使使用相同的编译器,我也不能使用“结构化绑定”。

为什么?

0 投票
3 回答
412 浏览

c++ - 如果 constexpr 格式正确,这是在内部使用 static_assert 吗?

昨天我读了几个答案static_assert(false, "Some message"),关于 an 的内部else子句的使用if constexpr。我知道根据标准,它被认为是格式错误的(即使某些编译器,包括 MSVC2017 会接受它)Qt 也会将此标记为错误。

我的问题是,下面的代码是否符合标准?(我倾向于这样认为,但我想确认一下。)

编辑

从我得到的评论看来,bool_value应该像这样定义:

使用模式

然后它是格式良好的,只是因为bool_value可以专门化为一个为表达式返回truebool_value<false, TypeOfValue>::value的版本。

0 投票
1 回答
240 浏览

c++ - 在非 constexpr 函数中作为左值传递的变量上使用“constexpr”函数

std::array用作表示在编译时具有固定长度的向量的基础,并希望std::array::size用作一个函数来禁用和向量constexpr的叉积计算。1D2D

当我std::array::size在非 constexpr 函数中使用时,它将我的向量作为左值参数,我得到一个错误:

这是该main函数的最小工作示例:

我发现这个问题提到了 GCC 8.0 中的一个错误,但我使用的是g++ (GCC) 10.1.0.

引用答案

表达式 e 是核心常量表达式,除非按照抽象机 (6.8.1) 的规则对 e 的求值将求值以下表达式之一:

... 一个 id 表达式,它引用引用类型的变量或数据成员,除非该引用具有前面的初始化,并且它是用常量表达式初始化的,或者它的生命周期在 e 的计算中开始

这是否意味着,在人类(非标准)语言中,在我的表达式e:=cross(p1,p2)中,p1并且p2在as 之前没有初始化,constexpr并且它们的生命周期不是以 开头e,所以即使p1andp2是在编译时知道其大小的数据类型的对象 nad谁的 mfunctionsize constexprmfunction,我现在必须将它们声明为 constexpr,然后才能将它们绑定为不是的函数中的左值constexpr

0 投票
1 回答
367 浏览

c++ - 为什么“if constexpr”的错误分支会被编译?

为什么这段代码在编译时会出错?我对“”的了解(以及这个if constexpr表明该else块不应该被编译。

错误是:

使用的编译器:g++ 版本 7.5.0
编译时我使用了-std=c++17标志。

PS缺少的';' 是故意的,只是为了检查是否else正在编译。

0 投票
2 回答
119 浏览

c++ - C++ constexpr if 语句的灵活性

我经常遇到这样的情况:

但是当A是时constexpr,没有办法向 if 语句表明 if Bis not also constexpr。此外,启用使用的解决方法constexpr是丑陋的:

是否有使constexpr if陈述更灵活的建议,即。考虑哪些条件是constexpr?如果没有,除了假设编译器会做正确的事情(他们并不总是这样做)之外,是否有解决这种情况的方法。

0 投票
1 回答
311 浏览

c++ - 如果评估,为什么 constexpr 中的代码无法访问?

我曾期望编译器允许在涉及 constexpr 的不可访问代码中出现无效或错误语句,如果:

任何解释/解决方法都会有所帮助