Lambda作为模板变量

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)

Jar*_*d42 1

目前,您存在 ODR 违规行为:

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

auto myvar<int> = []() -> int&{
    static int v;
    return v;
};
Run Code Online (Sandbox Code Playgroud)

但 lambda 为每个 TU 声明了不同的类型,因此您有lambda1lambda2for myvar<int>

每个 lambda 都有自己的static,这就是为什么您会在实践中看到该结果(但程序无论如何都是格式错误的,NDR)。