【问题标题】:Why does g++ states, that there is "no matching function for call cbegin(o)" for some valarray<double> o?为什么 g++ 声明对于某些 valarray<double> o 没有“调用 cbegin(o) 的匹配函数”?
【发布时间】:2015-11-22 04:29:30
【问题描述】:

请考虑以下代码:

using custom_t = std::valarray<unsigned>;
custom_t o;
unsigned acc = std::accumulate(std::cbegin(o), std::cend(o), 0);

g++-5 说

没有匹配函数调用cbegin(custom_t&amp;)

如果我改用std::begin(o)std::end(o),一切正常。这是编译器错误吗?代码使用 Visual Studio 2015 编译。

【问题讨论】:

  • Compiles in libc++. 我认为 libstdc++ 正在为满足容器概念的类型实现某种 SFINAE。由于std::valarray不是Container,所以调用失败。

标签: c++ g++ c++14


【解决方案1】:

这是一个 libstdc++ 错误,我刚刚创建了 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67374

【讨论】:

  • 这对我来说没有任何意义,为什么 std::beginstd::end 专门用于 std::valarray,但 std::cbeginstd::cend 不是。什么原因?
  • @0xbadf00d 原因可能是没有人想到这样做甚至指定。哪种有意义,考虑到 valarray 意味着相当轻量级且功能不那么丰富。我必须承认我自己从未使用过 valarray,因为我所知道的任何库都不能真正利用额外的别名限制(还有什么比 valarray 更可取的吗?)
  • "所以不支持所有访问容器的非成员函数。",我想知道为什么1.有非成员函数std::beginconst valarray 重载,2. 未选择来自&lt;iterator&gt; 的模板函数std::cbegin
  • 没有checking我不会问
  • @PiotrSkotnicki,这是因为 &lt;valarray&gt; 在为 valarrays 定义 beginend 重载之前包含 &lt;iterator&gt;,因此它们对 cbegin 不可见并且无法调用.这看起来像一个错误。
【解决方案2】:

没有

std::cbegin.

使用

unsigned acc = std::accumulate(o.cbegin(), o.cend(), 0);

感觉更加面向对象。

【讨论】:

  • std::cbegin 仅在 C++14 中引入,在 C++11 中没有引入
  • 所以,一个`std::cbegin´。我用 C++14 标记了我的问题。
  • 是的,但是如果您要查找重复项,stackoverflow.com/questions/31038061/support-of-stdcbeginin-c14 会弹出,说明 gcc 在 gcc-5.1 之前存在问题(您可能正在使用 gcc-5):) 干杯!
  • 很遗憾,std::valarray 没有成员函数cbegin/cend。所以,你的解决方案还是错的。
  • valarray 违反容器要求因为它不是容器
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
  • 2014-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多