相关疑难解决方法(0)

什么是声明和声明符以及它们的类型如何按标准解释?

标准究竟如何定义,例如,float (*(*(&e)[10])())[5]声明一个类型的变量"引用指向函数的10指针的数组()返回指向5 float" 数组的指针?

受到与@DanNissenbaum讨论的启发

c++ standards types declaration c++11

42
推荐指数
1
解决办法
6027
查看次数

使用auto和decltype从模板化类中的函数返回引用

如何使用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)

c++ templates decltype auto c++11

13
推荐指数
2
解决办法
5803
查看次数

TD [N]总是声明一个数组类型的对象吗?

我对[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确实是阵列类型?

c++ arrays declaration language-lawyer

6
推荐指数
1
解决办法
192
查看次数

尾随返回类型的名称查找和类型简化规则是什么?

尾随返回类型允许在以下两种情况下简化代码:

  1. 从类的成员函数之一返回在类内部定义的类型:

    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)
  2. 返回复杂的类型,例如函数指针类型:

    // 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,但是找不到任何简单的方法可以解释上述转换的工作原理。

我错过了吗?

标准的哪些部分解释了以上的尾随回返型简化形式?

c++ return-type language-lawyer c++11 trailing-return-type

6
推荐指数
1
解决办法
153
查看次数

为什么我不能用nullptr初始化自动推导的指针?

我试图做类似的事情:

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)

我试着谷歌搜索,但坦率地说,我甚至不知道如何正确地提出这个问题,因为我的标准很弱.任何见解将不胜感激!

c++ syntax casting

0
推荐指数
2
解决办法
100
查看次数