在与“变量模板”相关的一些调查中,我发现了一些奇怪的代码行为。标准对此行为有何说法?
//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
答案 0 :(得分:1)
当前,您违反了ODR:
在两个翻译单元中,您都有(替换后)
auto myvar<int> = []() -> int&{
static int v;
return v;
};
,但是lambda为每个TU声明不同的类型,
因此您有{{1}的lambda1
和lambda2
。
每个lambda都有其自己的myvar<int>
,这就是为什么您在实践中看到该结果的原因(但是程序仍然是格式错误的NDR)。