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

Mik*_*keT 11 c++ compiler-errors c++11 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() ......
Run Code Online (Sandbox Code Playgroud)

但是,我无法编译(我在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() ......
Run Code Online (Sandbox Code Playgroud)

我的第一个想法是我没有c ++ 14.所以我在Code :: Blocks中跟随了启用-std=c++14标志,我似乎将编译器设置为c ++ 14(一个例外是没有make.exe这样的make程序mingw32-make.exe(根据Settings/Compiler/Toolchain可执行文件).


我有: - 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))
Run Code Online (Sandbox Code Playgroud)

使用第二个代码(删除非静态初始化)我只是得到一个关于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))
Run Code Online (Sandbox Code Playgroud)

所以我相信我要么使用无效代码,要么我没有使用c ++ 14进行编译,而是使用c ++ 11.这个问题是其中之一,还是别的什么?

Pra*_*ian 12

Triangle x{ 2.0, 2.0 };
Run Code Online (Sandbox Code Playgroud)

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

此规则在C++ 14中进行了修改,现在允许聚合具有默认成员初始值设定项.看来你的编译器还不支持它.你的例子并上一个符合C++编译器14.