c++转换const引用传递
C++ conversion const pass-by-reference
给定模板,可以使用引用传递转换/类型强制转换操作符(不带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>()
一样调用它。
相关文章:
- 在 const 函数中通过引用和指针返回之间的区别
- 使用对const结构的const数组的引用进行构造
- 将const引用参数初始化为默认参数会导致悬空引用吗
- 在C++17中,引用const字符串的语义应该是什么
- 为什么当我为 for(auto& it : myUnorderedMap) {... = std::move(it.second)} 时,我会得到一个 const 引用?
- 类型为 "Bucket&"(未限定的 const 限定)的引用不能使用 "SortedList." 类型的值进行初始化 如何修复此错误?
- 为什么在引用指针时将 const 放在 & 符号的左侧有效,而在右侧则无效?
- 将返回类型专用化为 void 或 const 左值引用
- 在其他容器中使用 boost::container::static_vector 时,GCC 编译错误"将'const s'绑定到类型's&'的引用丢弃限定符"
- 在 C++ 中通过引用传递类成员时,Const 不起作用
- 我们可以有一个 setter 成员函数作为从 const 对象引用的 const 吗?
- 将对象传递给函数而不将其包装到 std::ref 中,而参数被指定为 const 引用
- 错误:对类型 'const ItemInstance' 的引用无法绑定到类型 'void' 的右值
- 包括"lvtocon.h",未定义对'operator<<(std::ostream&, char const*)的引用
- 如何在构造函数中传递 const 引用时强制编译器不接受右值
- 通过使用 const-cast 的非常量引用来延长临时的寿命
- const TYPE&- 我什么时候想通过引用 const 来使用?
- 指针引用const null值
- 三元运算符和通过引用const延长临时对象的生存期
- 为什么必须引用const来避免复制形参?