gpt4 book ai didi

c++ - 是否可以通过 const 引用获取参数,同时禁止转换以便不传递临时变量?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:00:19 26 4
gpt4 key购买 nike

有时我们喜欢通过引用获取一个大参数,并且如果可能的话还使引用成为 const 以表明它是一个输入参数。但是通过将引用设置为 const,编译器允许自己转换类型错误的数据。这意味着它效率不高,但更令人担忧的是我认为我指的是原始数据;也许我会使用它的地址,但没有意识到我实际上使用的是临时地址。

此代码中对 bar 的调用失败。这是可取的,因为引用的类型不正确。对 bar_const 的调用也是错误的类型,但它会自动编译。这对我来说是不可取的。

#include<vector>
using namespace std;

int vi;

void foo(int &) { }
void bar(long &) { }
void bar_const(const long &) { }

int main() {
foo(vi);
// bar(vi); // compiler error, as expected/desired
bar_const(vi);
}

传递轻量级只读引用的最安全方法是什么?我很想创建一个新的类似引用的模板。

(显然,intlong 是非常小的类型。但我发现了可以相互转换的更大结构。我不想要当我使用 const 引用时,这会悄悄发生。有时,将构造函数标记为 explicit 有帮助,但这并不理想)

更新:我想象一个如下所示的系统:想象有两个函数 X byVal();X& byRef(); 和以下代码块:

 X x;
const_lvalue_ref<X> a = x; // I want this to compile
const_lvalue_ref<X> b = byVal(); // I want this to fail at compile time
const_lvalue_ref<X> c = byRef(); // I want this to compile

该示例基于局部变量,但我希望它也可以使用参数。如果我不小心传递了一个 ref-to-temporary 或 ref-to-a-copy,而我想我会传递一些轻量级的东西,比如 ref-to-lvalue,我想得到某种错误消息。这只是一个“编码标准”——如果我真的想允许将 ref 传递给临时对象,那么我将使用简单的 const X&。 (我发现 this piece on Boost's FOREACH 非常有用。)

最佳答案

好吧,如果你的“大参数”是一个类,首先要做的是确保将任何单个参数构造函数标记为显式(复制构造函数除外):

class BigType
{
public:
explicit BigType(int);
};

这也适用于具有默认参数的构造函数,这些参数也可能被单个参数调用。

然后它不会被自动转换为,因为没有隐式构造函数供编译器用来进行转换。您可能没有任何生成该类型的全局转换运算符,但如果有,则

如果这对您不起作用,您可以使用一些模板魔术,例如:

template <typename T>
void func(const T &); // causes an undefined reference at link time.

template <>
void func(const BigType &v)
{
// use v.
}

关于c++ - 是否可以通过 const 引用获取参数,同时禁止转换以便不传递临时变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9004831/

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