簡體   English   中英

錯誤的std :: vector構造函數

[英]Wrong std::vector constructor

我在編譯應該是一個簡單的代碼行時從Clang得到一個奇怪的錯誤。

此代碼產生錯誤:

size_t s = 5;
std::vector<double> bestScores{s, -1.0};

我只是嘗試使用構造函數#2來填充具有五個-1.0值的新向量。 我得到的錯誤是非常量表達式不能從初始化列表中的類型'size_type'(又名'unsigned long')縮小到'double'

到底是怎么回事? 編譯好:

std::vector<double> bestScores{5, -1.0};

它是否嘗試使用初始化列表構造函數? 我認為你需要兩個花括號:

std::vector<double> bestScores{{5, -1.0}};

問題是您使用括號括起的初始化列表構造向量。 這適用於std::initializer_list<T>構造函數。 在這種情況下, size_t-1.0列表與std::initializer_list<double>兼容,因此構造函數被選中。 您需要使用舊式的C ++ 03構造:

std::vector<double> bestScores(s, -1.0);

這是支撐封閉初始化器的問題之一。 它們不適合某些標准庫容器實例化。 你必須記住std::initializer_list構造函數將勝過其他構造函數。

問題是當一個類有一個std::initializer_list構造函數時,如果參數可以轉換為initializer_list的類型(在這種情況下是double ),那么在使用統一初始化語法時它會更喜歡。 請參閱programmers.stackexchange.com上的詳細解答。

目前,您的解決方案是使用使用括號的非統一語法。 這意味着它不會考慮std::initializer_list構造函數,並在這種情況下執行您想要的操作。

std::vector<double> bestScores(s, -1.0)

暫無
暫無

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

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