我知道,从旧的 C++98 开始,如果函数声明/定义中未提及,则返回类型为复制的(按值),否则使用地址运算符“&”。
现在我正在玩弄 auto 和 decltype 的概念,让编译器确定返回类型。在一个示例中,我写了一个class A
除默认 ctor 外的任何其他 ctor 都被删除的地方(A 类取自一个真实项目 - 我调查了一些问题)。类 A 的对象与 etl::array (嵌入式模板库,在堆栈上创建的具有固定大小的数组)一起构造,请参见下面的示例代码。
#include <etl/array.h>
#include <iostream>
class A {
public:
A(std::uint8_t val) : _val(val){}
A(A const&) = delete; // copy delete
A& operator=(A&) = delete; // copy assign delete
A(A&&) = default; // move default
A& operator=(A&&) = delete;// move assign delete
~A() = default;
void whoAmI(){std::cout << " I am A! " << std::endl;}
private:
std::uint8_t _val;
};
decltype(auto) X(std::uint8_t val) {
return etl::array<A,1>{A{val}};
}
int main()
{
decltype(auto) x = X(5U);
for (auto& it : x) {
it.whoAmI();
}
}
我希望 etl::array 将被复制到 main() 例程中并分配给局部变量 x。由于已删除的副本 ctor,我不希望在数组中有 A 的副本。但是,代码可以编译,我可以在 etl::array 的元素上调用该函数。我无法理解为什么这是有效的以及为什么它正在编译?我想知道decltype(auto)
最后是什么类型。我之所以选择decltype(auto)
是因为 Scott-Meyers Item 2 和 Item 3。对于 item 3,我不确定对 decltype 主题有完整的了解..
当我单步执行代码时,它工作正常,让我陷入困境......
非常感谢有关此主题的任何帮助!
非常感谢您的帮助,对我很有启发。现在我终于知道它为什么起作用了 :-D - 你让我很开心!