[英]Is std::begin on an empty std::valarray undefined behavior?
我正在玩弄std::valarray
和 UndefinedBehaviorSanitizer,並注意到std::begin
一個空的std::valarray
會導致未定義的行為。 這是代碼:
#include <valarray>
int main() {
std::valarray<int> a;
std::begin(a);
}
要重現,請使用g++ -fsanitize=undefined
編譯代碼並運行結果可執行文件。
這是libstdc++的std::begin
實現。
template<class _Tp>
inline _Tp*
begin(valarray<_Tp>& __va)
{ return std::__addressof(__va[0]); }
似乎_val[0]
為空std::valarray
s 創建了 null 值的引用,這導致了未定義的行為。
這是 libstdc++ 的錯誤嗎?
§26.2.1 一般容器要求 [container.requirements.general]
表 83——容器要求
a.begin()
- 無前提條件
所以a.begin()
必須在空容器上有效。
然而, valarray
是在§29 Numerics library [numerics]章節的§29.7 Numeric arrays [numarray]中定義的,因此它不是容器庫章節的直接部分。
std::begin(valarray)
在§29.7.10 valarray range access [valarray.range]中定義,這里沒有提到先決條件。 最相關的報價野兔是:
§ 29.7.10 valarray 范圍訪問 [valarray.range]
數組的
begin
和end
返回的迭代器保證有效,直到為該數組調用成員 functionresize(size_t, T)
(29.7.2.8) 或直到該數組的生命周期結束,以先發生者為准。template <class T> unspecified 1 begin(valarray<T>& v); template <class T> unspecified 2 begin(const valarray<T>& v);
返回:引用數組中第一個值的迭代器。
所以問題是表 83 是否適用於此。 valarray
在§29.7.2 Class template valarray [template.valarray]中描述,標准說:
29.7.2.1 Class 模板 valarray 概述 [template.valarray.overview]
- class模板valarray是一維智能數組,
在我看來,這意味着valarray
是屬於§26.2.1 一般容器要求的容器
在我看來,空valarray
上的std::begin
應該是有效的。 另一方面,“返回:引用數組中第一個值的迭代器”可能暗示valarray
不能為空的前提條件。 所以我唯一的結論是標准在這方面應該更加明確。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.