我正在重温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。所以我跟着Enabling -std=c++14
flag in Code::Blocks,我似乎把编译器设置为c ++ 14(一个例外是没有make.exe
所以make程序是mingw32-make.exe
(按照设置/编译器/工具链可执行文件)。
我有: - GNU GCC 编译器
编译器设置为: -
-std = c ++ 14 编译器标志
-std = c ++ 98 -std = c ++ 0x -std = c ++ 11 as thececedes
工具链可执行文件: -
gcc.exe C编译器 g ++。exe C ++编译器 g ++。exe 动态库的链接器 ar.exe 静态库的链接器 GDB / CDB调试器:默认 windres.exe 资源编译器 mingw32-make.exe 制作节目
项目构建选项全部为空(因此我假设使用了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。这个问题是其中之一,还是别的什么?
答案 0 :(得分:13)
Triangle x{ 2.0, 2.0 };
上面一行试图执行Triangle
的聚合初始化。但是,在C ++ 11中,非静态数据成员初始化程序或默认成员初始化程序的存在(因为它们现在已知)阻止Triangle
成为聚合,并且初始化会失败。
此规则为modified in C++14,现在允许聚合具有默认成员初始值设定项。看来你的编译器还不支持它。您的示例在符合标准的C ++ 14编译器上执行compile。