C++模板:字节/引用相互干扰
C++ Templates: Byval/Reference interfering with eachother
这是我的问题的简化版本。我有一个财产类。它有has_initalized之类的数据,我在这个例子中删除了这些数据。
当我调用一个使用T的函数时,它很好。然而,T&不是吗?所以我决定写一篇T&但这会导致所有使用纯T的函数都出现编译错误。为什么T&干扰?对于这个例子,我如何在不更改main()的情况下让两个函数(Q和W)都工作?
template <class T>
class Property {
T v;
Property(Property&p) { }
public:
Property() {}
T operator=(T src) { v = src; return v; }
operator T() const { return v; }
operator T&() const{ return v; }
T operator->() { return v; }
};
class A{};
void Q(A s){}
void W(A& s){}
int main(){
Property<A> a;
Q(a);
W(a);
}
C++的重载规则中没有任何内容允许编译器在对Q的调用中在operatorT()
和operatorT&()
之间进行选择。因此,删除
operator T() const { return v; }
也将消除歧义。但是,您会遇到一个问题,因为不可能在const函数中返回对成员的非const引用。
对于Q
,您可以同时使用这两个转换函数。您可以通过使一个非常数使编译器更喜欢一个而不是另一个。
operator T() const { return v; }
operator T&() { return v; }
现在对于Q
,取operator T&
。这种方式还将修复对W
的调用以获得一个非常数引用。您也可以从其他返回常量引用
operator T const&() const { return v; }
operator T&() { return v; }
这种方式仍然更喜欢Q
的第二个转换函数,但如果对象a
是const,并且初始化了const引用,则并不总是需要复制v
。
相关文章:
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- Ctypes wstring通过引用传递
- c++r值引用应用于函数指针
- 理解c++中的引用
- C++取消引用指针.为什么会发生变化
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 强制转换为引用类型
- 引用一个已擦除类型(void*)的指针
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 具有默认值的引用获取函数
- 函数原型由于过载而干扰按引用传递
- 为什么转换为引用会干扰转换为布尔
- C++模板:字节/引用相互干扰