作为模板变量的 Lambda

Lambda as a template variable

本文关键字:Lambda 变量      更新时间:2023-10-16

在与"变量模板"相关的一些调查中,我发现了一些奇怪的代码行为。标准对这种行为有什么说明吗?

//Header.h
#pragma once
template<typename T>
auto myvar = []() -> T&{
static T v;
return v;
};
//Source.cpp
#include <iostream>
#include "Header.h"
void testFunction()
{
std::cout << myvar<int>() << 'n';
}
//main.cpp
#include <iostream>
#include "Header.h"
void testFunction();
int main(int argc, char **argv) 
{
myvar<int>() = 10;
testFunction();
std::cout << myvar<int>() << 'n';
}

输出:

0
10

我期待:

10
10

目前,您有 ODR 违规:

在两个翻译单元中,您都有(替换后(

auto myvar<int> = []() -> int&{
static int v;
return v;
};

但是 lambda 为每个 TU 声明了不同的类型, 所以你有lambda1lambda2myvar<int>.

每个lambda都有自己的static,这就是为什么你在实践中看到这个结果(但程序无论如何都是格式不正确的,NDR(。