【发布时间】:2018-10-03 14:35:17
【问题描述】:
在一些与“变量模板”相关的调查中,我发现了一些奇怪的代码行为。标准是否说明了这种行为?
//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
【问题讨论】:
-
您有两个不同的模板实例化,每个实例化一个 translation unit。该函数的每个实例都有自己的静态局部变量。这很好,符合预期。
-
@Someprogrammerdude:我想说违反 ODR,所以没有有效的期望。
-
我不确定你要在这里证明什么,但我不能说我喜欢这段代码。
-
@Someprogrammerdude 不是隐式内联的变量模板实例化吗?
-
@Quentin 没有说on cppreference.com,但它可能在规范中。
标签: c++ templates language-lawyer