[英]C++ initializer_list parameters - can they have default values?
[英]C++ initializer list and default values
這段代碼對C ++ 14有效嗎?
using namespace std;
struct Point
{
int x = 0;
int y = 0;
};
Point p2 {1, 1};
它使用clang ++ 7.0編譯得很好,在兩種情況下它都不適用於G ++ 4.9我將--std = c ++ 1y傳遞給編譯器。
在G ++中,當我從結構定義中刪除默認值時,它可以工作。
g++ test_constexpr_ctor.cc --std=c++1y -o test
test_constexpr_ctor.cc:7:15: error: no matching function for call to ‘Point::Point(<brace-enclosed initializer list>)’
Point p2 {1, 1};
^
test_constexpr_ctor.cc:7:15: note: candidates are:
test_constexpr_ctor.cc:1:8: note: constexpr Point::Point()
struct Point
^
test_constexpr_ctor.cc:1:8: note: candidate expects 0 arguments, 2 provided
test_constexpr_ctor.cc:1:8: note: constexpr Point::Point(const Point&)
test_constexpr_ctor.cc:1:8: note: candidate expects 1 argument, 2 provided
test_constexpr_ctor.cc:1:8: note: constexpr Point::Point(Point&&)
test_constexpr_ctor.cc:1:8: note: candidate expects 1 argument, 2 provided
代碼有效。
對象或類型T的引用的列表初始化定義如下: - 如果T是聚合,則執行聚合初始化
聚合是一個數組或類(第9條),沒有用戶提供的構造函數(12.1),沒有私有或受保護的非靜態數據成員(第11條),沒有基類(第10條),沒有虛函數(10.3) )。
請注意,在c ++ 11中,這個定義看起來不同(強調我的):
聚合是一個數組或類(第9節),沒有用戶提供的構造函數(12.1), 沒有用於非靜態數據成員(9.2)的大括號或相等初始化程序 ,沒有私有或受保護的非靜態數據成員(第11條),沒有基類(第10條),沒有虛函數(10.3)。
由於此部分在c ++ 14中被刪除,因此您的結構肯定是一個聚合,因此應該執行聚合初始化。
這被固定在gcc5(查詢的變化列表“聚集體與非靜態數據成員初始化”)。 我不會稱之為“bug”,而是gcc團隊只在gcc 5.1.0中實現了這一變化。
您發布的代碼絕對正確。
但是,您所擁有的行為是G ++版本4.9.1 尚未解決的錯誤 。 實際上,它可能是一個復制並在其他一些錯誤報告中關閉,因為問題是從g++
5.1.0或甚至早期版本修復的。 要找到實際的錯誤,您可以使用bugzilla的搜索 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.