问题标签 [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.
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”?
c++ - constexpr if 的等效三元运算符?
也许我错过了一些东西,但我找不到任何提示:C++17 中是否有一个与 constexpr-if 等效的 constexpr 三元运算符?
c++ - 类似“if constexpr”的东西,但用于类定义
if constexpr
是摆脱 C++ 程序中的预处理器的一大步。但是它只在函数中起作用——就像在这个例子中:
但是摆脱预处理器的梦想并不十分满足——因为以下示例无法编译:
1不能在类定义中使用它来不同地定义类的某些成员:
2它也不适用于非类范围(如全局范围):
我(几乎)确定这符合 C++17 规范,if constexpr
仅适用于函数体 - 但我的问题是:
Q1如何在 C++1z/C++14 中实现类和全局作用域类似的效果if-constexpr
?而且我不是在这里要求对模板专业化的另一种解释...但是具有与if constexpr
...类似的简单性的东西
Q2是否有针对上述范围扩展 C++ 的计划?
c++ - constexpr-if-else 主体能否在 constexpr auto 函数中返回不同类型?
我正在尝试编写一个函数,该函数根据枚举的运行时值将值的枚举映射到一组类型。我意识到您不能根据枚举的运行时值返回不同的类型,因为编译器不知道要分配多少堆栈空间。但是,我正在尝试将其编写为 constexpr 函数,使用新的 if-constexpr 功能来实现它。
我收到来自 clang 的错误,抱怨我使用了非法指定的模板参数。有谁看到如何实现这一点?
编辑:这是一个更容易理解的版本,更简洁地展示了我的问题:http: //coliru.stacked-crooked.com/a/2b9fef340bd167a8
旧代码:
错误:
c++ - if constexpr(condition) 作为编译时条件
我想使用 constexpr bool(useF
在下面的示例中)来启用以下代码中的功能。在这里,调用A::f()
. 此外,我想成为别名模板 ( a
),void
以防我关闭该功能。
我尝试使用 constexpr if 语句,但主体仍在被实例化,这会导致编译错误。如果我使用包装模板 ( X
),则正文将按我的预期被丢弃,但这对我来说似乎很难看。还有其他方法可以做到这一点吗?
我正在使用带有 -std=c++17 的 g++-7.0.1
c++ - 使用 constexpr 验证构造函数中的文字参数
我开始尝试constexpr
.
我想要实现的是验证literal
作为 ctor 参数提供的数值。
我从以下开始,如果构造MyStruct
值 <= 4,则抛出。
标记MyStruct
为constexpr
按预期工作,但这会阻止调用add
,因为它是不可变的。
我认为这可以完成,因为我只针对文字值(在编译时已知)。
我想避免使用模板。
c++ - 在通用 lambda 中使用“if constexpr”访问成员类型需要两个分支的格式都正确 - gcc 与 clang
考虑两个struct
具有不同成员类型别名的 s:
T
在上下文中给定 a template
,我想得到一个T::x
或T::y
取决于什么T
是:
g++
编译上面的代码,同时clang++
产生这个错误:
是否clang++
错误地拒绝了此代码?
请注意,clang++
通过通用 lambda 删除间接时接受代码l
:
c++ - 为什么这个“未定义的外部变量”不会导致 C++17 中的链接器错误?
我已经在 C++17 编译器 (Coliru) 中编译并运行了以下程序。在程序中,我声明了一个extern
变量,但没有定义它。但是,编译器不会给出链接器错误。
为什么编译器不给出链接器错误?
c++ - 在通用 lambda 中使用 constexpr-if 来确定参数的类型
我有以下问题:我有一个包含一个基类和两个子类的类层次结构。我已经实现了一个resolve_type
接受基类实例和通用 lambda(或类似)的函数。该函数解析其类型并将其传递给 lambda。在这个 lambda 中,我想在 constexpr-if 条件下检查列的类型,以排除某些类型。我曾尝试使用子类中的 constexpr 成员函数来做到这一点,但不幸的是没有奏效。
代码:
用法:
编译器错误:
我知道我可以decltype
用来获取类型,然后继续使用一些模板魔法,但我希望找到一些更具可读性的东西。我的项目已经使用了 boost 和它的 hana 库,所以解决方案也可以使用这两个。有没有人有任何想法?
c++ - 在 constexpr-if 条件下比较 constexpr 函数参数会导致错误
我正在尝试比较 constexpr-if 语句中的函数参数。
这是一个简单的例子:
但是,当我使用带有以下标志的 GCC 7 编译它时:
g++-7 -std=c++1z test.cpp -o test
我收到以下错误消息:
但是,如果我test_int
用不同的功能替换:
然后下面的代码编译没有错误:
我不明白为什么 constexpr-if 版本无法编译,特别是因为 static_assert 工作得很好。
对此的任何建议将不胜感激。
谢谢!