jca*_*cai 5 c++ templates c++17 if-constexpr
考虑以下代码。如果我的理解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{});
}
Run Code Online (Sandbox Code Playgroud)
用clang和gcc编译;但是使用最新的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
]
Run Code Online (Sandbox Code Playgroud)
如果删除了封闭的lambda,则代码将在所有三个编译器上编译。
我是在做错事还是不受支持,还是MSVC错误?
这是一个 MSVC 错误。请提交错误报告。
来自[stmt.if]/2 的规则是:
在封闭模板化实体的实例化期间,如果条件在实例化后不依赖于值,则不会实例化被丢弃的子语句(如果有)。
在实例化期间f<Z>,当我们实例化我们得到的条件时true。这与值无关,因此丢弃子语句(我们所做的z())没有被实例化。这只是z()导致错误的实例化 - 而且它不应该发生。
| 归档时间: |
|
| 查看次数: |
228 次 |
| 最近记录: |