【发布时间】:2014-11-23 14:37:08
【问题描述】:
所以我正在测试一些参考初始化表单,描述为here。我想知道什么时候:
T & ref = { arg1, arg2, ... };
和
T && ref = { arg1, arg2, ... };
表单将永远被使用,究竟是为了什么。我想这是用'initializer_list'初始化临时数组和构造函数,像这样:
int main()
{
struct _ab
{
_ab() {cout << "_ab()" << endl;}
_ab(initializer_list<int> iArr) : a(*iArr.begin()), b(*iArr.end()) {cout << "_ab()" << endl;}
~_ab() {cout << "~_ab()" << endl;}
int a, b;
};
const _ab & i = {1, 2};
cout << i.a << endl;
return 0;
}
在这种情况下,我尝试使用这样的默认构造函数使用临时“_ab”对象初始化 const 引用:
int main()
{
struct _ab
{
_ab() {cout << "_ab()" << endl;}
_ab(initializer_list<int> iArr) : a(*iArr.begin()), b(*iArr.end()) {cout << "_ab()" << endl;}
~_ab() {cout << "~_ab()" << endl;}
int a, b;
};
const _ab & i(); // error 1
cout << i.a << endl; // error 2
return 0;
}
但是这个例子没有编译,有 2 个错误:
错误 1:'const main()::_ab& i()',使用本地类型 'const 声明 main()::_ab', 被使用但从未定义 [-fpermissive]|
错误2:请求'i'中的成员'a',它是非类类型 'const main()::_ab&()'|
你能告诉我上面 2 的构造到底是什么意思吗?
编辑:我理解第二个示例的问题。它是在声明一个函数而不是变量。但是仍然有人可以解释一下为什么引用可以使用初始化列表进行初始化以及它的用途是什么?
【问题讨论】:
-
我已经编辑了我的答案。
-
切线地,
_ab是一个奇怪的类型名称...ab有什么问题?
标签: c++ c++11 gcc language-lawyer c++14