依赖于模板的Lamba依赖于作为该模板构造函数默认值的值在MSVC上失败



我刚刚升级了我的msvc,遇到了麻烦。

以下是在我的旧代码中重现问题的最小完全可验证示例:

#include <functional>
#define VERSION 1
template<typename T>
class Foo
{
public:
static constexpr int bar = 512;
#if VERSION == 1
Foo(std::function<int()> f = []() { return Foo<T>::bar;})
#elif VERSION == 2
Foo(std::function<int()> f = []() { return Foo::bar;})
#elif VERSION == 3
Foo(std::function<int()> f = []() { return bar;})
#elif VERSION == 4
Foo(std::function<int()> f = [bar = Foo<T>::bar]() { return bar;})
#endif
: m_f{std::move(f)}
{}
public:
std::function<int()> m_f;
};

void use()
{
Foo<int> foo;
}

现场演示

VERSION被定义为1时,这与我的原始代码类似。我还要支持clang和gcc。我的项目经常使用C++17标准(我的项目可能在未来一两年使用C++20(。

我正在寻找一些不错的解决方案,它不需要讨厌的#if,并涵盖所有编译器(新旧msvcgccclang(。

VERSION的其他值展示了我迄今为止所做的尝试(某些编译器总是失败(。

VERSION哪些编译器失败
1msvc 19.28
2msvc 19.28、msvc 19.27、msvc 19.55
3msvc所有版本
4clang 11.0

静态函数完成以下工作:

static std::function<int()> defaultF() {return []() { return bar;};}
Foo(std::function<int()> f = defaultF())
: m_f{std::move(f)}
{}

演示

最新更新