我不知道这个练习的意义是什么,所以这里有一个答案,从技术上讲可以满足您的要求:
auto helper()
{
struct {
int x;
} a {0};
return a;
}
decltype(helper()) foo()
{
return {8};
}
Run Code Online (Sandbox Code Playgroud)
该结构未命名。
foo 不返回命名变量。
当然,这简直是荒谬的——人们只会命名结构而不是这个decltype傻瓜。
对于初学者,C ++没有定义匿名结构。我认为您的意思是未命名的结构。
根据C ++标准,return语句的定义类似于(8.6 Jump语句)
return expr-or-braced-init-listopt ;
Run Code Online (Sandbox Code Playgroud)
因此,您不能在return语句中使用声明。如果是这样,则需要初步声明将返回的结构类型的对象。
不,这是不可能的。
您可以得到的最接近的结果是使用功能样式的强制转换创建临时文件,并使用C99样式的范围初始化器。GCC允许在C ++模式下将此作为扩展:
#include <iostream>
#include <string>
auto foo() {
return (struct {
int bar;
int square() {
return bar * bar;
}
}) { 7 };
}
Run Code Online (Sandbox Code Playgroud)
……但这不是可移植的(并且会警告)。
如果没有括号7,扩展名不会被触发,您将返回标准代码,在标准代码中,在cast中定义类型是非法的。
不必编写晦涩的代码,而是为您的类型命名并为对象命名。您的读者将感谢您。
| 归档时间: |
|
| 查看次数: |
282 次 |
| 最近记录: |