Лямбда как переменная шаблона - PullRequest
0 голосов
/ 03 октября 2018

Во время некоторых исследований, связанных с «шаблоном переменной», я обнаружил странное поведение кода для меня.Стандарт говорит что-нибудь об этом поведении?

//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 голосов
/ 03 октября 2018

В настоящее время у вас есть нарушение ODR:

В обеих единицах перевода у вас есть (после замены)

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

, но лямбда-код объявляет разные типы для каждого TU, поэтому у вас есть lambda1 и lambda2 для myvar<int>.

У каждой лямбды есть свой static, поэтому вы видите этот результат на практике (но программа все равно плохо сформирована, NDR).

...