Lambda作为模板变量

时间:2018-10-03 14:35:17

标签: 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';
}

输出:

0
10

我希望:

10
10

1 个答案:

答案 0 :(得分:1)

当前,您违反了ODR:

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

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

,但是lambda为每个TU声明不同的类型, 因此您有{{1}的lambda1lambda2

每个lambda都有其自己的myvar<int>,这就是为什么您在实践中看到该结果的原因(但是程序仍然是格式错误的NDR)。