【发布时间】:2018-04-26 10:59:12
【问题描述】:
我所指的一个例子:
#include <type_traits>
void voidFunction() {}
template <typename Function>
void lambdaTest(Function func) {
[func]() -> void {
int someInt;
if constexpr (std::is_same_v<std::invoke_result_t<Function>, int>) {
someInt = std::invoke(func);
} else {
std::invoke(func);
}
};
}
int main(int argc, char** argv) {
lambdaTest(&voidFunction);
return 0;
}
这在 gcc 7.2 中编译。但是,使用 MSVC 19.11.25547 我收到此错误:error C2440: '=': cannot convert from 'void' to 'int'
这段代码在两个编译器上都能正常编译:
#include <type_traits>
void voidFunction() {}
template <typename Function>
void nonLambdaTest(Function func) {
int someInt;
if constexpr (std::is_same_v<std::invoke_result_t<Function>, int>) {
someInt = std::invoke(func);
} else {
std::invoke(func);
}
}
int main(int argc, char** argv) {
nonLambdaTest(&voidFunction);
return 0;
}
在我看来,MSVC 似乎只是忽略了 constexpr if。这是 MSVC 中的错误,还是 constexpr 如果在 lambdas 中正式禁止?
【问题讨论】:
-
可能是编译器错误,这种支持是全新的。我想如果你在单独的函数中有 lambda 捕获和
constexpr if它可以正常工作?template <typename Function> void lambdaTest(Function func) { var lambda = [func](){ nonLambdaTest(func) }; lambda(); } -
假设
decltype(Function())应该产生返回的函数类型,我认为decltype(Function())应该是decltype(::std::declval<Function>()()),因为Function的类型将是指向函数的指针。所以这段代码似乎在这两种情况下都被破坏了。 -
@VTT - 你是对的。抱歉,我在测试中使用了 invoke_result 并用 decltype 愚弄并不小心复制了错误的。在文本中修复它
-
我从微软开发社区链接到这个问题:developercommunity.visualstudio.com/content/problem/229226/…
标签: c++ gcc visual-c++ lambda