为什么数组是常量?



这个问题是为什么alloca两次返回相同的地址的后续问题。我找到了一种方法,通过使用数组来获得两个实例的不同内存地址。

vml.h

#pragma once
#include <iostream>

namespace vml {
// Vectors
template <typename in_type, const int in_length>
class vec {
public:
vec(in_type* in_data) {
std::cout << data << std::endl;
std::copy(in_data, in_data + in_length, data);
}
vec() {
data = nullptr;
}
in_type& operator()(int index) const {
_ASSERT(0 <= index && index < in_length);
return data[index];
}
private:
in_type data[in_length];
};

main.cpp

#include <memory>
#include "vml.h"
int main() {
int list[] = { 1,2,3 };
int list2[] = {2,4,6 };
vml::vec<int, 3> a(list);
vml::vec<int, 3> b(list);
a(1) = 3;

return 0;
}
然而,当我运行代码时,我得到一个错误

Error C2440 'return': cannot convert from 'const in_type' to 'in_type &'

由于返回值是'data[index]',这一定意味着它是常量,然而,我没有将它定义为常量,所以为什么会发生这种情况?

您的operator()()的返回类型中缺少const

in_type const & operator()(int index) const {
_ASSERT(0 <= index && index < in_length);
return data[index];
}

当你用const修饰符声明成员函数时,当使用inside it时,所有的类成员都变成常量

如果你想要非const引用作为结果,你不应该在成员函数上使用const修饰符:

in_type & operator()(int index) {
_ASSERT( 0 <= index && index < in_length);
return data[index];
}

对于初学者,这个构造函数

vec() {
data = nullptr;
}

是无效的。数组是不可修改的左值。

这个成员函数

in_type& operator()(int index) const {
_ASSERT(0 <= index && index < in_length);
return data[index];
}

是一个常量成员函数。因此,数组数据被视为常量数组。

你可以像

那样重载函数
const in_type& operator()(int index) const {
_ASSERT(0 <= index && index < in_length);
return data[index];
} 

in_type& operator()(int index) {
_ASSERT(0 <= index && index < in_length);
return data[index];
}

在这种情况下,在这个语句

a(1) = 3;

将被称为非常量成员函数

注意这个构造函数

vec(in_type* in_data) {
std::cout << data << std::endl;
std::copy(in_data, in_data + in_length, data);
}

是不安全的。并且参数至少应该有限定符const

构造函数可以声明为
vec( const in_type *in_data, size_t n );

要修复它,必须重载操作符()两次

in_type const &operator()(int index) const {
_ASSERT(0 <= index && index < in_length);
return data[index];
}
in_type &operator()(int index) {
_ASSERT(0 <= index && index < in_lenght);
return data[index];
}

你必须这样做,因为当你创建一个const对象时,对象的任何成员都是const,所以方法不能返回引用,但它必须返回const引用,你可以使用这个方法,即使是非const方法,但你不能改变成员的值,这就是为什么你需要in_type operator()(int index)。重要的是,当您将一个方法限定为const时,这意味着它也可用于const对象,因此它必须处理任何成员,就像它是const一样。

最新更新