【发布时间】:2015-01-27 02:43:14
【问题描述】:
我有以下代码,其中我有成员 v_,一个 const 引用整数向量。它是用左值初始化的,所以我的 认为这不应该导致任何复制。
#include <iostream>
#include <iterator>
#include <vector>
using Vec = std::vector<int>;
void out(Vec const& v) {
using namespace std;
cout << "Vector (" << &v[0] << "): [";
ostream_iterator<int> out_it (cout,", ");
copy(v.begin(), v.end(), out_it);
cout << "]\n";
}
struct V {
V(Vec const& v) : v_{v}{}
Vec const& v_;
};
int main(int argc, char** argv) {
Vec v = { 1, 2, 3, 4, 5 };
out(v);
V wrapped { v };
out(wrapped.v_);
}
使用 clang 版本 3.6.0 (trunk 225298) 我得到以下输出:
~/tmp$ clang++ -std=c++11 -g -O0 vecmember.cpp
~/tmp$ ./a.out
Vector (0x2480010): [1, 2, 3, 4, 5, ]
Vector (0x2480010): [1, 2, 3, 4, 5, ]
这是我所希望的。 但是,使用 c++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2 我得到以下输出:
~/tmp$ c++ -std=c++11 -g -O0 vecmember.cpp
~/tmp$ ./a.out
Vector (0xa58010): [1, 2, 3, 4, 5, ]
Vector (0xa58030): []
当我进入调试器时,它进入 stl_vector.h 函数 vector(const vector& __x) 所以它试图复制构造传递给构造函数的原始向量.这是一个编译器错误还是我以某种方式做了一些未定义或完全错误的事情?
在这两种情况下,有什么更好的方法?
【问题讨论】:
-
列表初始化和引用的标准存在缺陷。 GCC 4.8 不折不扣地实现了标准(包括缺陷)。标准缺陷后来被修复,GCC 4.9 实现了修复。
-
@T.C.是的,这就是答案,想把它写成一个吗? :)
标签: c++ c++11 vector reference constants