gpt4 book ai didi

c++ - if constexpr inside lambda, 不同的编译器行为

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:32:49 32 4
gpt4 key购买 nike

考虑以下代码。如果我对 if constexpr 的理解是正确的,则不应编译 else 分支,因此不应将 z() 视为错误。

#include <type_traits>

struct Z{};

template<typename T>
void f(T z) {
auto lam = [z]() {
if constexpr(std::is_same<T, Z>::value) {
} else {
z();
}
};
}

int main() {
f(Z{});
}

clanggcc这编译;但对于最新的 MSVC,它没有。不幸的是,goldbolt 的 MSVC 太旧了,但在我的机器上完全更新了 VS 2017,cl/std:c++17 产生了:

Microsoft (R) C/C++ Optimizing Compiler Version 19.14.26428.1 for x86
Copyright (C) Microsoft Corporation. All rights reserved.

if_constexpr.cpp
if_constexpr.cpp(10): error C2064: term does not evaluate to a function taking 0 arguments
if_constexpr.cpp(16): note: see reference to function template instantiation 'void f<Z>(T)' being compiled
with
[
T=Z
]

如果删除封闭的 lambda,代码将在所有三个编译器上编译。

我是不是做错了什么或不受支持,或者只是一个 MSVC 错误?

最佳答案

这是一个 MSVC 错误。请提交错误报告。

规则,来自[stmt.if]/2 , 是:

During the instantiation of an enclosing templated entity, if the condition is not value-dependent after its instantiation, the discarded substatement (if any) is not instantiated.

f<Z> 的实例化过程中,当我们实例化我们得到的条件时 true .这不是值依赖的,所以 discard 子语句(我们做 z() 的那个)没有被实例化。这只是 z() 的实例化导致错误 - 它不应该发生。

关于c++ - if constexpr inside lambda, 不同的编译器行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50372167/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com