簡體   English   中英

std::begin 是空的 std::valarray 未定義行為嗎?

[英]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++ 的錯誤嗎?

n4659 - C++17 最終工作草案

§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]

  1. 數組的beginend返回的迭代器保證有效,直到為該數組調用成員 function resize(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);
  2. 返回:引用數組中第一個值的迭代器。

所以問題是表 83 是否適用於此。 valarray§29.7.2 Class template valarray [template.valarray]中描述,標准說:

29.7.2.1 Class 模板 valarray 概述 [template.valarray.overview]

  1. class模板valarray是一維智能數組,

在我看來,這意味着valarray是屬於§26.2.1 一般容器要求的容器

在我看來,空valarray上的std::begin應該是有效的。 另一方面,“返回:引用數組中第一個值的迭代器”可能暗示valarray不能為空的前提條件。 所以我唯一的結論是標准在這方面應該更加明確。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM