簡體   English   中英

我使用的是c ++ 14,或者是我的代碼,使用結構,無效?

[英]I am using c++14 or is my code, using structs, invalid?

我正在重溫C ++並且一直在關注一個沒有實際問題的教程。 但是,我有一個關於結構的部分,它說在c ++ 14中你可以使用非靜態初始化unifrom初始化 按照:-

但是,在C ++ 14中,這個限制被解除了,兩者都可以使用。 如果兩者都提供,則初始化列表/統一初始化語法優先。 在上面的例子中,Triangle x將被初始化為長度和寬度2.0。

我的代碼是: -

struct Triangle
{
    double length = 1.23; // non-static member initialization
    double width = 2.45;
};

int Triangular()
{
Triangle x{ 2.0, 2.0 }; // uniform initialization

return 0;
}

...... 
int main() ......

但是,我無法編譯(我在Windows 7上使用Code :: Blocks )。 如果我刪除非靜態初始化並使用(即刪除= 1.23= 2.45 ),那么它確實編譯: -

struct Triangle
{
    double length; // non-static member initialization
    double width;
};

int Triangular()
{
Triangle x{ 2.0, 2.0 }; // uniform initialization

return 0;
}

...... 
int main() ......

我的第一個想法是我沒有c ++ 14。 所以我在Code :: Blocks中跟隨了啟用-std=c++14標志 ,我似乎將編譯器設置為c ++ 14(一個例外是沒有make.exe所以make程序是mingw32-make.exe (根據設置/編譯器/工具鏈可執行文件 )。


我有: - GNU GCC編譯器

編譯器設置為: -

-std = c ++ 14編譯器標志

-std = c ++ 98 -std = c ++ 0x -std = c ++ 11 as thecececedes

工具鏈可執行文件: -

gcc.exe C編譯器g ++。exe C ++編譯器g ++。exe鏈接器用於動態庫ar.exe鏈接器用於靜態庫GDB / CDB調試器:默認 windres.exe資源編譯器mingw32-make.exe制作程序

Project Build選項都是空白的(所以我假設使用了Code :: Block設置。)


當我編譯失敗的代碼(第一個帶有非靜態初始化的代碼)時,我得到以下內容: -

構建日志

g++.exe -Wall -fexceptions -g -std=c++14  -c "D:\C++ Projects\gettingStarted\main.cpp" -o obj\Debug\main.o
D:\C++ Projects\gettingStarted\main.cpp: In function 'int Triangular()':
D:\C++ Projects\gettingStarted\main.cpp:24:22: error: no matching function for call to 'Triangle::Triangle(<brace-enclosed initializer list>)'
 Triangle x{ 2.0, 2.0 }; // uniform initialization
                      ^
D:\C++ Projects\gettingStarted\main.cpp:24:22: note: candidates are:
D:\C++ Projects\gettingStarted\main.cpp:16:8: note: constexpr Triangle::Triangle()
 struct Triangle
        ^
D:\C++ Projects\gettingStarted\main.cpp:16:8: note:   candidate expects 0 arguments, 2 provided
D:\C++ Projects\gettingStarted\main.cpp:16:8: note: constexpr Triangle::Triangle(const Triangle&)
D:\C++ Projects\gettingStarted\main.cpp:16:8: note:   candidate expects 1 argument, 2 provided
D:\C++ Projects\gettingStarted\main.cpp:16:8: note: constexpr Triangle::Triangle(Triangle&&)
D:\C++ Projects\gettingStarted\main.cpp:16:8: note:   candidate expects 1 argument, 2 provided
Process terminated with status 1 (0 minute(s), 0 second(s))
1 error(s), 0 warning(s) (0 minute(s), 0 second(s))

使用第二個代碼(刪除非靜態初始化)我只是得到一個關於x沒有被使用的警告(我可以管理它),如下所示: -

構建日志

-------------- Build: Debug in gettingStarted (compiler: GNU GCC Compiler)---------------

g++.exe -Wall -fexceptions -g -std=c++14  -c "D:\C++ Projects\gettingStarted\main.cpp" -o obj\Debug\main.o
D:\C++ Projects\gettingStarted\main.cpp: In function 'int Triangular()':
D:\C++ Projects\gettingStarted\main.cpp:24:10: warning: unused variable 'x' [-Wunused-variable]
 Triangle x{ 2.0, 2.0 }; // uniform initialization
          ^
g++.exe  -o bin\Debug\gettingStarted.exe obj\Debug\main.o obj\Debug\myotherfile.o   
Output file is bin\Debug\gettingStarted.exe with size 1.07 MB
Process terminated with status 0 (0 minute(s), 1 second(s))
0 error(s), 1 warning(s) (0 minute(s), 1 second(s))

所以我相信我要么使用無效代碼,要么我沒有使用c ++ 14進行編譯,而是使用c ++ 11。 這個問題是其中之一,還是別的什么?

Triangle x{ 2.0, 2.0 };

上面的行試圖執行Triangle聚合初始化。 但是,在C ++ 11中,非靜態數據成員初始化程序或現在稱為默認成員初始化程序的存在阻止了Triangle成為聚合,並且初始化將失敗。

此規則在C ++ 14中進行了修改,現在允許聚合具有默認成員初始值設定項。 看來你的編譯器還不支持它。 你的例子並上一個符合C ++編譯器14。

暫無
暫無

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

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