繁体   English   中英

如果constexpr里面的lambda,不同的编译器行为

[英]if constexpr inside lambda, differing compiler behavior

请考虑以下代码。 如果我对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的规则是:

在封闭模板化实体的实例化期间,如果条件在其实例化之后不依赖于值,则不实例化丢弃的子语句(如果有的话)。

f<Z>的实例化期间,当我们实例化条件时,我们得到了true 这不依赖于值,因此丢弃子语句(我们执行z()那个子语句)不会被实例化。 它只是导致错误的z()实例化 - 它不应该发生。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM