问题标签 [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 回答
1896 浏览

c++ - 带有优化的“constexpr if”与“if” - 为什么需要“constexpr”?

C++1z 将引入“constexpr if”——一个 if 将根据条件删除其中一个分支。似乎合理且有用。

但是,没有 constexpr 关键字就不可能吗?我认为在编译期间,编译器应该知道在编译期间是否知道条件。如果是,即使是最基本的优化级别也应该删除不必要的分支。

例如(参见 Godbolt:https ://godbolt.org/g/IpY5y5 ):

Godbolt explorer 显示,即使带有 -O0 的 gcc-4.4.7 也没有编译“return 1”,所以它实现了 constexpr if 所承诺的。显然,当条件是 constexpr 函数的结果时,这样的旧编译器将无法这样做,但事实仍然存在:现代编译器知道条件是否是 constexpr,并且不需要我明确地告诉它。

所以问题是:

为什么“constexpr if”中需要“constexpr”?

0 投票
3 回答
9130 浏览

c++ - constexpr if 的等效三元运算符?

也许我错过了一些东西,但我找不到任何提示:C++17 中是否有一个与 constexpr-if 等效的 constexpr 三元运算符?

0 投票
3 回答
6038 浏览

c++ - 类似“if constexpr”的东西,但用于类定义

if constexpr是摆脱 C++ 程序中的预处理器的一大步。但是它只在函数中起作用——就像在这个例子中:

但是摆脱预处理器的梦想并不十分满足——因为以下示例无法编译:

1不能在类定义中使用它来不同地定义类的某些成员:

2它也不适用于非类范围(如全局范围):

我(几乎)确定这符合 C++17 规范,if constexpr仅适用于函数体 - 但我的问题是:

Q1如何在 C++1z/C++14 中实现类和全局作用域类似的效果if-constexpr?而且我不是在这里要求对模板专业化的另一种解释...但是具有与if constexpr...类似的简单性的东西

Q2是否有针对上述范围扩展 C++ 的计划?

0 投票
1 回答
3338 浏览

c++ - constexpr-if-else 主体能否在 constexpr auto 函数中返回不同类型?

我正在尝试编写一个函数,该函数根据枚举的运行时值将值的枚举映射到一组类型。我意识到您不能根据枚举的运行时值返回不同的类型,因为编译器不知道要分配多少堆栈空间。但是,我正在尝试将其编写为 constexpr 函数,使用新的 if-constexpr 功能来实现它。

我收到来自 clang 的错误,抱怨我使用了非法指定的模板参数。有谁看到如何实现这一点?

编辑:这是一个更容易理解的版本,更简洁地展示了我的问题:http: //coliru.stacked-crooked.com/a/2b9fef340bd167a8

旧代码:

错误:

0 投票
1 回答
2070 浏览

c++ - if constexpr(condition) 作为编译时条件

我想使用 constexpr bool(useF在下面的示例中)来启用以下代码中的功能。在这里,调用A::f(). 此外,我想成为别名模板 ( a),void以防我关闭该功能。

我尝试使用 constexpr if 语句,但主体仍在被实例化,这会导致编译错误。如果我使用包装模板 ( X),则正文将按我的预期被丢弃,但这对我来说似乎很难看。还有其他方法可以做到这一点吗?

我正在使用带有 -std=c++17 的 g++-7.0.1

0 投票
1 回答
280 浏览

c++ - 使用 constexpr 验证构造函数中的文字参数

我开始尝试constexpr.
我想要实现的是验证literal作为 ctor 参数提供的数值。
我从以下开始,如果构造MyStruct 值 <= 4,则抛出。

标记MyStructconstexpr按预期工作,但这会阻止调用add,因为它是不可变的。

我认为这可以完成,因为我只针对文字值(在编译时已知)。
我想避免使用模板。

0 投票
1 回答
383 浏览

c++ - 在通用 lambda 中使用“if constexpr”访问成员类型需要两个分支的格式都正确 - gcc 与 clang

考虑两个struct具有不同成员类型别名的 s:

T在上下文中给定 a template,我想得到一个T::xT::y取决于什么T是:

g++编译上面的代码,同时clang++产生这个错误:

在 godbolt.org 上,带有一致性查看器


是否clang++错误地拒绝了此代码?

请注意,clang++通过通用 lambda 删除间接时接受代码l

0 投票
4 回答
4220 浏览

c++ - 为什么这个“未定义的外部变量”不会导致 C++17 中的链接器错误?

我已经在 C++17 编译器 (Coliru) 中编译并运行了以下程序。在程序中,我声明了一个extern变量,但没有定义它。但是,编译器不会给出链接器错误

为什么编译器不给出链接器错误?

0 投票
2 回答
1376 浏览

c++ - 在通用 lambda 中使用 constexpr-if 来确定参数的类型

我有以下问题:我有一个包含一个基类和两个子类的类层次结构。我已经实现了一个resolve_type接受基类实例和通用 lambda(或类似)的函数。该函数解析其类型并将其传递给 lambda。在这个 lambda 中,我想在 constexpr-if 条件下检查列的类型,以排除某些类型。我曾尝试使用子类中的 constexpr 成员函数来做到这一点,但不幸的是没有奏效。

代码:

用法:

编译器错误:

我知道我可以decltype用来获取类型,然后继续使用一些模板魔法,但我希望找到一些更具可读性的东西。我的项目已经使用了 boost 和它的 hana 库,所以解决方案也可以使用这两个。有没有人有任何想法?

0 投票
2 回答
1275 浏览

c++ - 在 constexpr-if 条件下比较 constexpr 函数参数会导致错误

我正在尝试比较 constexpr-if 语句中的函数参数。

这是一个简单的例子:

但是,当我使用带有以下标志的 GCC 7 编译它时: g++-7 -std=c++1z test.cpp -o test 我收到以下错误消息:

但是,如果我test_int用不同的功能替换:

然后下面的代码编译没有错误:

我不明白为什么 constexpr-if 版本无法编译,特别是因为 static_assert 工作得很好。

对此的任何建议将不胜感激。

谢谢!