我所指的一个例子:
#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中的一个错误,还是如果在lambda中被正式禁止的话是constexpr?
答案 0 :(得分:0)
我已经简化了这个例子(或者至少使其更加明显):
#include <type_traits>
#include <utility>
template<typename TPointerToFunction>
void lambdaTest(TPointerToFunction)
{
[]() -> void // comment this line to make it work
{
constexpr const bool returns_int
{
std::is_same_v
<
int
, decltype(::std::declval<TPointerToFunction>()())
>
};
static_assert(!returns_int);
if constexpr(returns_int)
{
static_assert(returns_int, "how did we get here?");
}
};
}
void voidFunction(void) {}
int
main()
{
lambdaTest(&voidFunction);
return(0);
}