Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 返回指向不可修改成员数组C++;gcc警告_C++_Pointers_Gcc - Fatal编程技术网

C++ 返回指向不可修改成员数组C++;gcc警告

C++ 返回指向不可修改成员数组C++;gcc警告,c++,pointers,gcc,C++,Pointers,Gcc,我想返回一个指向类所拥有的数组的指针。但是,我不想允许用户修改该数据或指针。根据我的理解,您需要使用以下语法返回指向常量数据的常量指针 const Type *const Class::Method() { return this->data_; } 但是,gcc在编译时给出以下警告 警告:在函数返回类型上忽略类型限定符 为什么gcc会提供此警告?这是什么意思?如果这不是我想要的语法,那么什么是?第一个常量是正确的,第二个常量没有任何意义。看看这个例子: const int f

我想返回一个指向类所拥有的数组的指针。但是,我不想允许用户修改该数据或指针。根据我的理解,您需要使用以下语法返回指向常量数据的常量指针

const Type *const Class::Method() {
    return this->data_; 
}
但是,gcc在编译时给出以下警告

警告:在函数返回类型上忽略类型限定符


为什么gcc会提供此警告?这是什么意思?如果这不是我想要的语法,那么什么是?

第一个常量是正确的,第二个常量没有任何意义。看看这个例子:

const int foo();
int a = foo();

在这种情况下,如果foo返回const int或just int,则不会改变任何内容。类型*相同

对于内置类型,将忽略顶级
const
。由于C++[3.14p4]中有一条规则:
类和数组prvalues可以具有cv限定类型;其他PRValue始终具有cv不合格类型。
。在您的示例中,生成指针的顶级
常量将被忽略


您可以将
const
添加到末尾:
consttype*Class::Method()const{…}
。这将防止在成员函数内修改指针。但是,由于成员函数返回不可修改的prvalue,因此不必这样做以防止在类之外修改指针成员(这也是C++中存在此规则的原因)。当您希望通过对
对象等的常量引用来调用函数时,它可能很有用,但对于您正在执行的操作,这似乎不是必需的。

您收到的警告是因为忽略了最后的
常量。脱下它,你就准备好了


您不需要返回指向
const
数据的
const
指针,只需返回指向
const
数据的指针(即
const类型*
)。正如返回一个
const int
没有意义一样,返回一个
t*const
也没有意义,因为一旦将该值分配给一个新变量,该
const
就会被丢弃。

返回
std::vector
不是更容易吗?我正在使用一个需要常量浮点*的C接口,出于性能方面的原因,我不想实例化std::vector。请告诉我们
类型的正式定义;你的例子与这个问题无关。试着用相同的警告级别编译const int foo(){return 0;},看看它是如何无关的……我不认为
const Type*Class::Method()const
应该是这个答案的一部分:这可能是正确的做法,但它与他的要求没有任何关系。(特别是因为他的代码现在似乎编译没有错误)@StephenLin:我重新编写了答案以澄清(谢谢)。