Igo*_*gor 8 c++ templates language-lawyer
在与"变量模板"相关的一些调查中,我发现了一些奇怪的代码行为.标准是否说明了这种行为?
//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';
}
Run Code Online (Sandbox Code Playgroud)
输出:
0
10
Run Code Online (Sandbox Code Playgroud)
我预计:
10
10
Run Code Online (Sandbox Code Playgroud)
目前,您存在 ODR 违规行为:
在两个翻译单元中,您有(替换后)
auto myvar<int> = []() -> int&{
static int v;
return v;
};
Run Code Online (Sandbox Code Playgroud)
但 lambda 为每个 TU 声明了不同的类型,因此您有lambda1和lambda2for myvar<int>。
每个 lambda 都有自己的static,这就是为什么您会在实践中看到该结果(但程序无论如何都是格式错误的,NDR)。