C++ lambda作为模板函数中静态变量的一部分

C++ lambda作为模板函数中静态变量的一部分,c++,c++17,static-variables,function-templates,generic-lambda,C++,C++17,Static Variables,Function Templates,Generic Lambda,假设我们定义了一个简单的结构s,在头文件中包含2个成员(1个int和1个functor)。我们在模板函数foo中创建一个这样的结构作为静态常量变量,并返回该结构的常量引用。它在c++17中合法吗?我尝试在两个翻译单元中调用foo,它与clang/gcc一起工作,但与visualstudio一起失败。在Visual Studio中,第二个调用者返回错误的m\n(0而不是5) #包括 模板 结构{ 国际货币基金组织; Func mu Func; S(int n,Func Func):m_n(n),m

假设我们定义了一个简单的结构
s
,在头文件中包含2个成员(1个int和1个functor)。我们在模板函数
foo
中创建一个这样的结构作为静态常量变量,并返回该结构的常量引用。它在c++17中合法吗?我尝试在两个翻译单元中调用
foo
,它与clang/gcc一起工作,但与visualstudio一起失败。在Visual Studio中,第二个调用者返回错误的
m\n
(0而不是5)

#包括
模板
结构{
国际货币基金组织;
Func mu Func;
S(int n,Func Func):m_n(n),m_Func(Func){}
};
模板
自动常量&foo()无异常{

静态auto const s=s(5,[](auto const&)noexcept{std::coutsems对我来说很好。小的变化(使用
constepr
)也会成功如果在多个翻译单元中使用它会导致链接问题吗?或者可能Visual Studio在这里有一个bug。
模板默认情况下是
内联的,所以ODR应该没问题。我打赌msvc的错误。你使用的是哪个版本的VS?VS 2017(15.8.0)/VS 2019(16.4.5)都显示了相同的结果。
#include <iostream>

template<typename Func>
struct S {
    int m_n;
    Func m_func;
    S(int n, Func func): m_n(n), m_func(func) {}
};

template<typename T>
auto const& foo() noexcept {
    static auto const s=S(5, [](auto const&) noexcept { std::cout<<"lambda"<<std::endl; });
    return s;
}