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

标签 c++ visual-c++ c++17 clang++

我刚刚升级了我的 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;
}

Live demo

VERSION定义为 1这类似于我的原始代码。 我还必须支持 clang 和 gcc。 Curretly 我的项目正在使用 C++17 标准(我的项目可能在明年或两年内使用 C++20)。

我正在寻找一些不需要讨厌的解决方法 #if并涵盖所有编译器(旧新 msvc gcc clang )。

VERSION的其他值展示我到目前为止所做的尝试(总是有些编译器失败)。

<表类="s-表"> <头> 版本 哪些编译器失败了 <正文> 1 MSVC 19.28 2 msvc 19.28,msvc 19.27,msvc 19.25 3 msvc所有版本 4 clang 11.0

如果有人知道 MSVC 链接的相应错误报告也很好。

最简单的解决方法是将常量移动到全局范围,但我更愿意避免这种情况。

最佳答案

静态函数完成工作:

static std::function<int()> defaultF() {return []() { return bar;};}

Foo(std::function<int()> f = defaultF())
    : m_f{std::move(f)}
{}

Demo

关于c++ - Lamba 依赖模板依赖值作为该模板构造函数的默认值在 MSVC 上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65253124/

相关文章:

c++ - vector 类型不完整(C++ 17)的编译错误

c++ - 我应该让我的局部变量是常量还是可 move ?

c++ - 为什么这个初始化本身不会产生编译器警告?

c++ - 如何从 ip 地址或 sockaddr_in 结构(C++/WinAPI)获取主机名?

visual-c++ - 使用opencv在vc++中将RGB图像转换为灰度图像

c++ - Visual Studio F5、ctrl+F5 或在 Visual Studio 之外运行有什么不同?

C++,vs 2010 中的模糊继承错误

c++ - 分析多进程系统

c++ - 环绕模式 std::begin;返回开始(c);进入一个功能

c++ - 条件运算符 ( ? : ) in C++ be compile time?