标准究竟如何定义,例如,float (*(*(&e)[10])())[5]声明一个类型的变量"引用指向函数的10指针的数组()返回指向5 float" 数组的指针?
如何使用auto/decltype强制模板化类中的函数返回对成员变量的引用?
这是我正在尝试做的一个简单的例子.假设您有一个模板化的类,它将某些内容存储在私有成员变量中,a_如下所示:
#include <iostream>
template <typename T>
class A
{
private:
T a_;
public:
A(T a) : a_(a) {}
// 1. Return const reference to a_
const T & get() const { return a_; }
// 2. Return non-const reference to a_
T & get() { return a_; }
};
int main(int argc, char *argv[])
{
A<int> a(3);
const auto & a1 = a.get(); // 1. Return const reference to a_
//a1 = 4; // Shouldn't compile
std::cout …Run Code Online (Sandbox Code Playgroud) 我对[dcl.array]/1感到困惑:
在TD的声明中,D表格
D1 [ constant-expression opt ] attribute-specifier-seq opt
并且声明T D1中的标识符的类型是" derived-declarator-type-list T",则D的标识符的类型是数组类型; ...
考虑声明:
int (*p)[42];
Run Code Online (Sandbox Code Playgroud)
该声明满足上述语法(并且不满足前面段落中描述的语法),因此本段应该适用,因此我们得出结论,类型p是数组类型.但是,我们知道该类型的p就是pointer to array of 42 int,这是一个指针类型.
我错过了什么吗?或者pointer to array of 42 int确实是阵列类型?
尾随返回类型允许在以下两种情况下简化代码:
从类的成员函数之一返回在类内部定义的类型:
struct X
{
using foo = int;
foo f();
};
// pre-C++11
X::foo X::f() { /* ... */ }
// trailing, doesn't require `X::` before `foo`
auto X::f() -> foo { /* ... */ }
Run Code Online (Sandbox Code Playgroud)返回复杂的类型,例如函数指针类型:
// pre-C++11
int(*g(float))(int) { /* ... */ }
// trailing, easier to read
auto f(float) -> int(*)(int) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)我正在尝试查找Standard的相关部分,以解释上述两种简化的工作方式。我已经看过[basic.lookup]并略过了trailing-return,但是找不到任何简单的方法可以解释上述转换的工作原理。
我错过了吗?
标准的哪些部分解释了以上的尾随回返型简化形式?
我试图做类似的事情:
auto foo = int*(nullptr);
Run Code Online (Sandbox Code Playgroud)
哪个VC++不能编译错误消息:
不允许输入名称
并且GCC 8.2不能编译:
'int'之前的预期主表达式
我真的很好奇为什么这似乎是一种非法的语法.在我看来它应该没问题,因为文字可以像这样初始化.
auto foo = int(2);
Run Code Online (Sandbox Code Playgroud)
我能想到让它工作的唯一方法是创建一个类型别名或执行此操作:
auto foo = std::add_pointer_t<int>(nullptr);
Run Code Online (Sandbox Code Playgroud)
我试着谷歌搜索,但坦率地说,我甚至不知道如何正确地提出这个问题,因为我的标准很弱.任何见解将不胜感激!