我使用的是c ++ 14,或者是我的代码,使用结构,无效?

时间:2016-08-19 21:44:34

标签: c++ c++11 compiler-errors c++14

我正在重温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。这个问题是其中之一,还是别的什么?

1 个答案:

答案 0 :(得分:13)

Triangle x{ 2.0, 2.0 };

上面一行试图执行Triangle的聚合初始化。但是,在C ++ 11中,非静态数据成员初始化程序或默认成员初始化程序的存在(因为它们现在已知)阻止Triangle成为聚合,并且初始化会失败。

此规则为modified in C++14,现在允许聚合具有默认成员初始值设定项。看来你的编译器还不支持它。您的示例在符合标准的C ++ 14编译器上执行compile