作为模板变量的 Lambda
Lambda as a template variable
在与"变量模板"相关的一些调查中,我发现了一些奇怪的代码行为。标准对这种行为有什么说明吗?
//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
目前,您有 ODR 违规:
在两个翻译单元中,您都有(替换后(
auto myvar<int> = []() -> int&{
static int v;
return v;
};
但是 lambda 为每个 TU 声明了不同的类型, 所以你有lambda1
和lambda2
myvar<int>
.
每个lambda都有自己的static
,这就是为什么你在实践中看到这个结果(但程序无论如何都是格式不正确的,NDR(。
相关文章:
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 在 lambda 捕获中声明的变量的类型推导
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 在 C++ 中访问 lambda 捕获初始化变量
- Visual C++: MSVC vs. GCC+CLANG: 处理 lambda 捕获类成员变量,正确的方法是什么?
- 作为模板变量的 Lambda
- 变量不在 lambda 的范围内
- 为什么 lambda 采用变量的初始值
- 为什么捕获 lambda 不捕获变量?
- C++ lambda:如何'freeze'局部变量的值?
- 获取具有静态局部变量的绑定/推断捕获 lambda 的函数指针
- Simulink "Access Violation"写入 C++ lambda 函数捕获列表中的 PWork 变量
- C++使用 lambda 初始化变量
- 如何在 lambda 表达式中传递变量?
- C++将 lambda 函数另存为成员变量,而不使用函数指针进行优化
- C++ lambda - 捕获静态成员变量
- 是否有一种方法可以编写此短片而不捕获lambda变量
- 为什么我的全球外部lambda变量在运行时不初始化
- lambda变量捕获
- 使用 auto 在 C++ 中声明 lambda 变量的首选方法是什么