【问题标题】:Fail with dummy_array<int, 6> arr();dummy_array<int, 6> arr(); 失败
【发布时间】:2019-06-08 00:19:39
【问题描述】:

问题在于数组的声明。

我们可以评论

#include <cstdlib>
#include <fstream>
#include <iostream>
#include <vector>
#include <list> 

template <typename Type, size_t const SIZE>
class dummy_array {
    Type data[SIZE] = {};

  public:
    dummy_array(){}
    ~dummy_array(){}

    Type& operator[](size_t const index)
    {
      if (index < SIZE)
        return data[index];
      throw std::out_of_range("index out of range");
    }

    Type const& operator[](size_t const index) const
    {
      if (index < SIZE)
        return data[index];
      throw std::out_of_range("index out of range");
    }

};
int main()
{
    {
      dummy_array<int, 6> arr();
      arr[0] = 1;
      arr[1] = 2;

      for (int i = 0; i < 6; i++)
        std::cout << arr[i] << " " ;
    std::cout << std::endl;

    }
    return 0;
}

有人能解释一下为什么用“dummy_array arr();”声明吗?导致故障如下。 构建日志:

main.cpp: In function 'int main()':

main.cpp:34:12: error: pointer to a function used in arithmetic [-Wpointer-arith]

   arr[0] = 1;

        ^

main.cpp:34:16: 错误:分配只读位置 '* arr'

   arr[0] = 1;

            ^

main.cpp:35:12: 错误:指向算术中使用的函数的指针 [-Wpointer-arith]

   arr[1] = 2;

        ^

main.cpp:35:16: 错误:分配只读位置 '*(arr + 1)'

   arr[1] = 2;

            ^

main.cpp:38:27: 错误:指向算术中使用的函数的指针 [-Wpointer-arith]

     std::cout << arr[i] << " " ;

                       ^

【问题讨论】:

  • dummy_array&lt;int, 6&gt; arr(); 替换为dummy_array&lt;int, 6&gt; arr{}; 或只是dummy_array&lt;int, 6&gt; arr;,您可能会收到警告empty parentheses interpreted as a function declaration
  • 非常感谢。我得到了你的答案,因为编译器将其视为函数,并因违反对元素的访问而导致失败。

标签: c++ c++17


【解决方案1】:
dummy_array<int, 6> arr();

这既可以看作函数声明,也可以看作变量声明。

编译器总是更喜欢函数声明而不是变量声明,因此您实际上声明了一个名为 arr 的函数,不接受任何参数并返回一个 dummy_array。改用这个:

dummy_array<int, 6> arr{};

【讨论】:

  • 其实这不是最令人头疼的 Parse;这是一个误解。 (您链接到的文章确实解释了这一点。)但是,您的其余答案是正确的。
  • 哦,不解释了。习惯了。
  • 我现在无法访问 Effective STL,所以我相信你。标准的第 8.2 节确实讨论了声明中的函数样式转换,但当然没有提到“Most Vexing Parse”这个名称。直到
  • 我目前正在处理的令人头疼的解析总是最令人头疼的。 ;)
  • 这是一个常见的误解。它最终源于相同的语言规则。但这并不是“诡计”,甚至不是真正的惊喜;这只是一个错误/错字。当你写的东西看起来应该是一个对象声明(这不是!)但结果不是。
猜你喜欢
  • 2010-11-18
  • 2021-09-16
  • 2019-12-19
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
  • 2018-06-16
  • 2015-01-06
  • 2011-01-11
相关资源
最近更新 更多