簡體   English   中英

C ++初始化列表和默認值

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

代碼有效。

  1. (8.5.4 / 3):

對象或類型T的引用的列表初始化定義如下: - 如果T是聚合,則執行聚合初始化

  1. c ++ 14中的聚合定義為(8.5.1 / 1):

聚合是一個數組或類(第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.

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