gpt4 book ai didi

C++ 强制初始化表达式中左值的常量性

转载 作者:太空狗 更新时间:2023-10-29 21:39:36 25 4
gpt4 key购买 nike

我希望编译器强制执行左值(非引用)的常量性,但不知道这在 C++ 中是否可行。一个例子:

int foo() { return 5; }

int main() {
// Is there anything I can add to the declaration of foo()
// that would make the following cause a compile-error?
int a = foo();

// Whereas this compiles fine.
const int a = foo();
}

最佳答案

对于像 int 这样的东西,这实际上是不可能的,因为您需要授予读取 int 的权限,如果他们可以读取 int,那么他们可以将其复制到非常量 int 中。

但是从您的评论来看,您实际上拥有的不是 int 而是更复杂的用户定义类型,也许是某种容器。您可以轻松地创建不可变容器。该容器可以是包装器,也可以是现有容器的替代实现。那么无论调用者使用 const 还是非常量变量都没有关系,它仍然是不可变的。

class MyClass {
std::vector<int> data;
public:
MyClass(size_t size) : data(size) {}
int& operator[](size_t index) { return data[index]; }
int operator[](size_t index) const { return data[index]; }
size_t size() const { return data.size(); }
};

class MyClassImmutable {
MyClass mc;
public:
MyClassImmutable(MyClass&& mc) : mc(std::move(mc)){}
int operator[](size_t index) const { return mc[index]; }
size_t size() const { return mc.size(); }
const MyClass& get() const { return mc; }
};

MyClassImmutable foo() {
MyClass mc(100);
mc[10] = 3;
return mc;
}

void func(const MyClass& mc);

int main() {
MyClassImmutable mci = foo();
std::cout << mci[10] << "\n"; // Can read individual values
//mci[10] = 4; // Error immutable
func(mc.get()); // call function taking a const MyClass&
}

Live demo.

当然,没有什么可以阻止调用者从不可变容器中复制每个值并将它们插入可变容器中。

编辑:另一种方法可能是返回一个指向常量的智能指针。唯一的缺点是您必须为动态内存分配付费:

std::unique_ptr<const MyClass> foo() {
auto mc = std::make_unique<MyClass>(100);
(*mc)[10] = 3;
return mc;
}

void func(const MyClass& mc);

int main() {
auto mc = foo();
std::cout << (*mc)[10] << "\n"; // Can read individual values
//(*mc)[10] = 4; // Error const
func(*mc); // can pass to a function taking a const MyClass&
}

关于C++ 强制初始化表达式中左值的常量性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32522959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com