lambda内部捕获的constexpr变量失去了其constexpr-ness
Constexpr variable captured inside lambda loses its constexpr-ness
此代码在g (coliru)中填充了罚款,而不是MSVC(Godbolt和My VS2017)。
#include <type_traits>
#include <iostream>
template<class T> void f(){
constexpr bool b=std::is_same_v<T,int>; //#1
auto func_x=[&](){
if constexpr(b){ //#error
}else{
}
};
func_x();
}
int main(){
f<int>();
}
(6):错误C2131:表达未评估为常数
的用法
(6):注意:失败是由于其寿命以外的变量读取
引起的 (6):注意:请参阅" this''
哪个(G 或MSVC)是错误的?
什么是" "中的 this
,请参见'this''的用法?
如何在保留编译时保证的同时如何处理?
在我的真实情况下, b (#1)
是一个复杂的语句,取决于其他一些constexpr变量。
gcc是正确的。b
(作为constexpr
变量)实际上不需要捕获。
lambda表达式可以读取变量的值而无需捕获 如果变量
- 是constexpr,没有可变成员。
GCC Live
似乎如果制作b
static
,那么MSVC可以访问b
而无需捕获。
template<class T> void f(){
constexpr static bool b=std::is_same_v<T,int>;
auto func_x=[](){
if constexpr(b){
}else{
}
};
func_x();
}
MSVC Live
和
如何在保持编译时保证的同时如何处理?
我们无法保留捕获变量的constexpr-。它们成为lambda关闭类型的非静态数据成员,而非静态数据成员不能为constexpr
。
如何在保持编译时保证的同时如何处理?
将constexpr bool
标记为static
作为工作。
请参阅 demo
另外,您可以在if constexpr
中使用该条件,而不是将其分配给bool
。如下:
if constexpr(std::is_same_v<T,int>)
请参阅 demo
请注意,有关lambda表达的constexpr
已为MSVC提出了错误。
其中之一是:在lambda中捕获Constexpr的问题
另一个是:如果lambda中的constexpr
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 多成员Constexpr结构初始化
- 条件constexpr函数
- constexpr 函数中的非文字(通过 std::is_constant_evaluated)
- Visual C++ constexpr Hints
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 为什么constexpr的性能比正常表达式差
- 是否可以使用if constexpr删除控制流语句
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 为什么std::isnan 不是 constexpr?
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 更多constexpr容器是否需要mark_immutable_if_consexpr
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- constexpr上下文中std::initializer_list的验证
- constexpr构造函数需要常量成员函数时出现问题
- vs 2015 constexpr变量不恒定,但与2019相比还好吗
- C++constexpr实现差异
- 添加静态constexpr成员是否会更改结构/类的内存映射
- lambda内部捕获的constexpr变量失去了其constexpr-ness