c++转换const引用传递

C++ conversion const pass-by-reference

本文关键字:引用 const 转换 c++      更新时间:2023-10-16

给定模板,可以使用引用传递转换/类型强制转换操作符(不带const):

class TestA
{
    public:
        //Needs to be a const return
        template<typename TemplateItem>
        operator TemplateItem&() const {TemplateItem A; A = 10; return A;}
};
int main()
{
    TestA A;
    {
        int N;
        N = A;
        printf("%d!n",N);
    }
    {
        float N;
        N = A;
        printf("%f!n",N);
    }
    return 0;
}

并且给定以下代码(带有const):

class TestA
{
    public:
        //Produces error
        template<typename TemplateItem>
        operator const TemplateItem&() const {TemplateItem A; A = 10; return A;}
};

产生以下错误:

错误:无法在赋值时将'TestA'转换为'int'
错误:无法在赋值时将'TestA'转换为'float'

如何使转换/类型强制转换操作符返回模板类型的const引用传递?

<

上下文/strong>

在大多数人进来并担心"你不能把它转换成任何东西"之前,你需要上下文。上面的代码是伪代码——我只对可能的const引用返回感兴趣,而不是模板化转换函数的缺陷。但如果你想知道它的作用,它是相对简单的:

TemplateClass ->转换(转换为字节数据)->文件
TemplateClass <-转换(从字节数据更改回来)<-文件

用户应该知道他们得到了什么,或者它应该是自动的(即保存/加载状态)。是的,模板有一个通用的方法,使用指针将任何类型转换为字节数据。

别跟我胡扯,说性病已经在做这种事了。转换过程是更复杂的类库设置的一部分。

我是程序员。相信我。c++信任我,允许我犯错误。只有这样我才能学会

首先,您的转换操作符已经是未定义的行为,因为您返回了对超出作用域的局部变量的引用(const或非const)。如果您将转换操作符更改为按值返回,则不会产生UB,则应该可以正常工作。

编辑:(删除了有关转换操作符的错误信息)。

但是你真的确定你真的想要你的类类型可以转换成任何东西吗?这似乎只会在将来你维护代码时引起许多麻烦,并且它会自动转换为意想不到的类型。

另一种可能的实现是创建一个as模板方法,它基本上做你的转换操作符想做的事情,并像obj.as<int>()一样调用它。

相关文章: