在C++中,变量声明左侧的大括号是什么意思?
In C++, what do braces on the left-hand side of a variable declaration mean?
这个GitHub文件中的代码使用了我不熟悉的C++变量"声明"语法:
std::unique_ptr<CRecentFileList> {m_pRecentFileList} = std::make_unique<CRecentFileList>(...
(m_pRecentFileList
在超类中声明。
将变量声明包装在大括号中是什么意思?(不是初始值设定项列表(
我提取了一个最小的测试用例,它编译:
class foo {
int* p;
void f(){
std::unique_ptr<int> {p} = std::make_unique<int>(1);
}
};
将int* p
更改为std::unique_ptr<int> p
会由于unique_ptr(const unique_ptr&) = delete;
而创建编译错误
这让我认为大括号声明分配给具有相同名称的外部范围变量。我尝试创建一个测试程序,但它无法编译:
int main(){
int x;
int {x} = 1;
}
error: using temporary as lvalue [-fpermissive]
这不是一个声明。这是临时任务。
在std::unique_ptr<int> {p} = std::make_unique<int>(1);
中,std::unique_ptr<int> {p}
创建一个临时unique_ptr
,该获得p
指向对象的所有权,然后将std::make_unique<int>(1)
分配给该临时对象,这会导致对象p
点被删除,临时对象获得make_unique
创建的int
的所有权;最后,在;
, 临时本身被销毁,删除make_unique
创建的int
。
最终结果是delete p
加上一个无用的新/删除周期。
(如果它使用括号而不是大括号,这将是一个声明:std::unique_ptr<int> (p) = std::make_unique<int>(1);
完全等同于std::unique_ptr<int> p = std::make_unique<int>(1);
。
相关文章:
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- "类模板示例<int>;"语句对 C++11 是什么意思?
- 线应该是什么意思
- "CID"在AT+HTTPPARA= "CID" ,1中是什么意思
- 表达式"b=(b-x)&x"是什么意思?
- 这个表达是什么意思?
- 此代码验证公式是什么意思?
- 跟踪日志中的T.11803()是什么意思?
- 这个额外的关键字在这个 c++ 类声明中是什么意思?
- * 和 ** 在 C++ 函数声明中是什么意思?
- _T("xyz")是什么意思?
- #define Dbg(fmt,..) (0) 是什么意思? 警告:表达式无效
- 这行代码到底是什么意思?
- 在命名空间名称之前加上 :: 是什么意思?
- 从字符数组的元素中减去'a'是什么意思
- "friend"关键字在C++中是什么意思?
- 减法中的"0"是什么意思?
- 字符数组前面的加号是什么意思?
- 这里的字符串函数是什么意思