【问题标题】:Pointer into vector, but not into a valarray?指向向量的指针,但不是指向 valarray 的指针?
【发布时间】:2011-05-20 00:23:21
【问题描述】:

我正在尝试提取一个 const 指针以指向数组的一部分。我发现它在使用向量时工作正常,但在使用 valarray 时不会编译(VS 2008)。谁能解释一下是什么问题?

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
    }
};

【问题讨论】:

  • 这两种用法都违反了vector或valarray的封装。
  • @Charles Peng:第一个在技术上还可以。向量明确保证与 C 样式数组兼容的连续存储。此外,该标准准确定义(a)当向量的迭代器无效(例如在调整大小时)时,向量的迭代器可以实现为指向元素类型的指针(b)
  • @sehe:感谢您的评论。我知道第一次使用是可以的。但我想说的是,它违背了封装的目的。
  • 好的。我明白你的意思。我同意,但应该注意的是,这最终取决于你使用向量的目的。您可以将其用作模块化容器,或者仅用作具有堆栈语义的“动态数组外壳”。该标准确实明确支持这两种使用场景。
  • @Charles Peng:不幸的是,许多像 BLAS/LAPACK 这样的代码不支持 valarray。它们只支持指针。

标签: c++ pointers valarray


【解决方案1】:

std::valarray&lt;T&gt;::operator [](std::size_t) 返回一个T&amp;,它可以正常工作。

std::valarray&lt;T&gt;::operator [](std::size_t) const 返回一个T,这将是一个右值,因此无法获取其地址。

因为valarray_test::pointy 本身就是const,所以valarray_test::v 被视为const,因此调用operator[]const 重载。要么使valarray_test::vmutable 要么使valarray_test::pointyconst

【讨论】:

  • 这是有道理的。是否假定 valarray 仅用于可以作为副本有效返回的简单类型? valarray 不能被设计为返回引用是否有充分的理由?
  • "是否假定 valarray 仅用于可以作为副本有效返回的简单类型?" 确实。 “valarray 不能设计为返回引用有充分的理由吗?” 不是在现代编译器中,但在 valarray 最初出现时它可能是一种可证明的优化设计(valarray 专门为提高出球效率而设计)。
  • 更重要的是:valarray 类被定义为没有某些形式的别名,因此可以优化对这些类的操作。(引自 C++ 标准草案 N3485, 26.6.1/2)
猜你喜欢
  • 2011-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-10
  • 1970-01-01
  • 1970-01-01
  • 2018-08-28
  • 2013-07-19
相关资源
最近更新 更多