问题标签 [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 投票
1 回答
3168 浏览

c++ - 使用 lambda 编译 constexpr 时出现 MSVS2017 错误“表达式未计算为常量”

我正在使用 MSVS c++17,下面的代码无法编译:

在函数“makeIndices”中,我标记了出现错误的位置。它看起来像:

错误 C2131:表达式未计算为常量

注意:失败是由在其生命周期之外读取变量引起的

注意:参见“pred”的用法

注意:请参阅正在编译的函数模板实例化 'auto makeIndices<8,Pred,0,>(const Pred &)' 的参考...

上面的代码在 GCC ( Link )上编译并运行良好。

但是如何为 MSVS 修复它?

0 投票
1 回答
838 浏览

c++ - 仍在评估废弃分支中的嵌套 constexpr-if 语句?

在我看来,在 MSVC(版本 15.7.3)中评估了另一个 constexpr-if 语句的废弃分支内的 constexpr-if 语句。

考虑以下代码:

上面的代码无法在 MSVC 中编译,因为当超出元组的边界std::tuple_element_t时将导致静态断言失败。I这表明被丢弃分支中的代码也以某种方式被评估,即使它依赖于模板参数I

根据cppreference, constexpr-if 要求“对于所有可能的专业化,被丢弃的语句不能是错误的”,但我很难确定这里是否是这种情况。

GCC 和 Clang 似乎也可以毫无问题地接受此代码(在 Compiler Explorer 上测试)。

C++ 标准是否可以接受编译错误,或者这里的 MSVC 不兼容?

(另外,如果标准不能保证我期望代码执行的操作,是否有另一种方法来完成嵌套的 constexpr-if 语句?)

0 投票
1 回答
114 浏览

c++ - 从语言设计级别,当无法在编译时推断条件时,为什么“if constexpr”不会衰减为“trival if”

众所周知,当constexpr function的返回值在 时无法知道时compile-time,将延迟到run-time(IOW, 衰减到non-constexpr function) 时计算。这使我们可以自由地坚持constexpr一个功能,而不必担心任何开销。

我认为它也可以适用于if statement. 从 c++17 开始,我们有了if constexpr,所以我们可以compile-time if statement很容易地使用(没有true_type/ false_typeconstexpr function但是,与 不同的是,如果在编译时无法知道其条件,它将失败:

所以,上面的代码不能通过编译,因为n不是常量表达式。但可以肯定的是,可以在 compile-time 知道输入时计算该函数compile-time

0 投票
2 回答
223 浏览

c++ - 为什么递归 constexpr 模板值无法编译?

我正在定义一种方法来了解类型在类型列表中的位置,使用 C++17 中的递归模板。我尝试了两种方法:一种使用 constexpr 值,另一种使用 constexpr 函数。第二个 usingif语句编译,而第一个 using 三元运算符不编译。

我的编译器 migw64 说:

模板参数的数量错误(1,应至少为 2)
constexpr std::size_t index_of = std::is_same_v<Searching,First> ?0 : 1 + index_of<正在搜索,其他...>;

据我了解,三元运算符需要评估它的两个操作数,所以它不能用于这种类型的递归。

我对吗 ?如果是,为什么会这样?
谢谢你。

0 投票
1 回答
301 浏览

c++ - C++ 17:如何使用 if constexpr 调用不同的构造函数?

假设我有一个类在其构造函数中采用布尔值,如果调用不同的函数,则取决于布尔值。

我是 C++17 的新手,我想知道是否可以使用模板编程和if constexpr. api是这样的:

0 投票
1 回答
2676 浏览

c++ - 使用 constexpr-if 时出错:在 'constexpr' 之前应有 '('

我正在尝试使用 if-constexpr 来检查一些东西,但我遇到了类似的错误

预期 '(' 在 'constexpr' 之前

'else' 没有前面的 'if' "

到目前为止,我检查我的代码没有问题

我的编译标志是 g++ -std=c++17 main.cpp

0 投票
1 回答
75 浏览

c++ - MSVC 使用 constexpr if 从可变参数模板方法中的基本模板参数中吞下 const

我有一个问题,我几乎可以肯定是一个 MSVC 错误,但也许我遗漏了一些东西。

这是实际代码的简化版本:

如您所见,foo1()和之间的唯一区别foo2()是 constexpr if。以下是我尝试在 MSVC 中编译一些测试时发生的情况:

我得到的错误test1.foo1()是:

相同的代码在使用 GCC 的 Linux 上编译没有问题。此外,在 MSVC 中也可以对非基本类型进行相同的尝试:

因此,由于某种原因,当使用 constexpr if 和 const 基本类型作为模板参数时,似乎const会被吞没。当它不是可变参数模板时,不会发生此问题。

是一个活生生的例子。

我是否正确地假设它是一个编译器错误?

0 投票
1 回答
256 浏览

c++ - LLVM 覆盖被 if-constexpr 混淆

在以下位置使用常量表达式时,我遇到了一个关于 LLVM 覆盖率的奇怪问题if-statement

执行的实例化:

在这些中没有一个是sizeof(T) <= sizeof(int)执行的。然而,在第一种情况下,实例化 ( int) 的主体if确实按应有的方式执行。在其他情况下,它显示为已执行。

编译命令行的相关部分:

链接器命令行的相关部分:

当条件被提取到它自己的函数时,两个int实例long long在覆盖范围中正确显示为执行sizeof(T) <= sizeof(int)部分。什么可能导致这种行为以及如何解决它?它是 Clang/LLVM cov 中的错误吗?

有任何想法吗?

编辑:这似乎是 LLVM 中的一个已知错误(虽然尚不清楚 LLVM-cov 还是 Clang):

https://bugs.llvm.org/show_bug.cgi?id=36086

https://bugs.chromium.org/p/chromium/issues/detail?id=845575

0 投票
2 回答
179 浏览

c++ - 许多嵌套 std::conditional_t 的替代品?

我发现许多嵌套的 std::conditional_t 难以阅读,所以我选择了不同的模式(在具有自动返回类型的函数上调用 decltype):

我的问题是:

有没有更好的办法?

这种方式编译速度是否比 std::conditional_t 慢(假设我需要实例化的类型比我只使用内置类型的示例中要扩展得多)。

PS 这是一个玩具示例,IRCode 我将处理一些更复杂的类型。

0 投票
2 回答
801 浏览

c++ - constexpr if else 表达式中的“预期语句”

我有一个函数test,它打印出枚举参数的基础类型:

该程序在 Visual Studio 2017(使用 ISO C++17)中编译并运行良好,但最后一个else用红色下划线显示以下消息:

期待一个声明

在第 12 行的“void test(TEnum v) [with TEnum=TestEnum]”实例化期间检测到

最后一个“else”的程序代码用红色下划线。

(我试过使用else constexpr而不是else,但这似乎并不重要。)

如果我删除最后一个else if -branch (检查uint64_t的那个),错误就会消失:

没有最后一个“else if”分支的程序代码,也没有错误消息。

这是 Visual Studio 中的错误,还是我做了不应该做的事情?