C++ 指针指向向量,但不指向数组?

C++ 指针指向向量,但不指向数组?,c++,pointers,valarray,C++,Pointers,Valarray,我试图通过数组的一部分提取一个常量指针。我发现它在使用向量时运行良好,但在使用数组时不会编译(VS2008)。有人能解释一下问题是什么吗 struct vector_test { std::vector<int> v; const int *pointy(const int i) const { return &(v[i]); // Ok } }; struct valarray_test { std::valarr

我试图通过数组的一部分提取一个常量指针。我发现它在使用向量时运行良好,但在使用数组时不会编译(VS2008)。有人能解释一下问题是什么吗

struct vector_test
{
    std::vector<int> v;

    const int *pointy(const int i) const
    {
        return &(v[i]); // Ok
    }
};

struct valarray_test
{
    std::valarray<int> v;

    const int *pointy(const int i) const
    {
        return &(v[i]); // error C2102: '&' requires l-value
    }
};
结构向量测试 { std::向量v; 常数int*pointy(常数int i)常数 { 返回&(v[i]);//确定 } }; 结构Valu测试 { std::valv阵列; 常数int*pointy(常数int i)常数 { 返回&(v[i]);//错误C2102:“&”需要l值 } };
std::valarray::operator[](std::size\u t)
返回一个
t&
,这将正常工作

std::valarray::operator[](std::size_t)const
返回一个
t
,该值将是一个右值,因此不能获取其地址


由于
valarray\u test::pointy
本身就是
const
valarray\u test::v
被视为
const
,因此调用
操作符[]
const
重载。要么使
valarray\u test::v
可变
,要么使
valarray\u test::pointy
常量

这两种用法都违反了向量或valarray ecapsulation。@Charles Peng:第一种在技术上是可以的。向量明确地保证了连续存储与C样式阵列的兼容性。此外,该标准准确地定义了(a)当向量的迭代器无效时(例如,在调整大小时),向量的迭代器可能实现为指向元素类型的指针(b)@sehe:谢谢你的评论。我知道第一次使用是可以的。但是我想说的是,它违反了封装的目的。我明白你的意思。我同意,但需要注意的是,这取决于你最终使用向量的目的。您可以将其用作模块化容器,也可以将其用作具有堆栈语义的“动态数组外壳”。该标准确实明确支持这两种使用场景。@Charles Peng:不幸的是,许多代码(如BLAS/LAPACK)不支持valarray。它们只支持指针,这是有道理的。是否假定
valarray
仅用于可以作为副本高效返回的简单类型?为什么
valarray
不能被设计为返回一个引用,有什么好的理由吗?“是否假定
valarray
只用于可以有效地作为副本返回的简单类型?”是的。“为什么
valarray
不能被设计为返回引用,这有什么好的理由吗?”现代编译器没有这样做,但在
valarray
最初设计时,它可能是一个可证明的优化(
valarray
是为了提高效率而明确设计的)。更重要的是:
valarray
类被定义为没有某些形式的别名,从而允许对这些类的操作进行优化。(引用C++标准草案N348,22.61/1)