[英]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.