我有一个函数返回一个由两个整数组成的命名结构,如下所示:
struct myStruct {int i; int j;}; myStruct myFunction(int myArg){ switch (myArg) { case 0: return {1,2}; case 1: return {2,3}; default: return {4,5}; } }
我希望能够从switch语句返回适当初始化的结构.
我可以通过声明一个命名结构并初始化它然后返回命名结构来做到这一点,
但是如果我可以让编译器为我创建匿名结构,就像我上面的例子那样会更清晰 – 它不能编译.
这可以合法地工作吗?或者实现目标的最简洁方法是什么?
解决方法
如果我们查看
draft C++ standard部分,这是完全有效的C 11代码.6.6.3返回声明第2段说:
A return statement with a braced-init-list initializes the object
or reference to be returned from the function by copy-list-initialization (8.5.4) from the specified initializer list.
它提供了以下示例:
[ Example: std::pair<std::string,int> f(const char* p,int x) { return {p,x}; } —end example ]
我们可以从a live example看到它起作用,但是从这个live example我们可以看到它不会在C 11之前起作用.
如果您正在使用gcc或clang且由于某种原因无法使用C 11,则可以选择使用compound literals作为C语言中的扩展,即使它是C99功能,我们可以从live example中看到gcc警告:
warning: ISO C++ forbids compound-literals [-Wpedantic]
struct myStruct { int i; int j; myStruct() : i(0),j(0) {} ; myStruct(int x,int y) : i(x),j(y) {} ; }; myStruct myFunction(int myArg){ switch (myArg) { case 0: return myStruct(1,2) ; case 1: return myStruct(2,3) ; default: return myStruct(4,5) ; } }