C++;覆盖地址运算符 我希望能够在C++标准编译器中做到这一点: void DoSomething(Object* object) { } DoSomething(&Object())
使用默认地址运算符,它将把构造的对象保存到寄存器中,然后在DoSomething()中覆盖它。。。对于所有对象(除了不能覆盖它们的基类型),在一行中完成这项工作会非常好 这就是我所拥有的:C++;覆盖地址运算符 我希望能够在C++标准编译器中做到这一点: void DoSomething(Object* object) { } DoSomething(&Object()),c++,operator-keyword,C++,Operator Keyword,使用默认地址运算符,它将把构造的对象保存到寄存器中,然后在DoSomething()中覆盖它。。。对于所有对象(除了不能覆盖它们的基类型),在一行中完成这项工作会非常好 这就是我所拥有的: class Object { public: Object* operator&(Object object) { return &object; } }; 这显然只是一个循环,无法指定我想要的是基本的&运算符,而不是覆盖的。当我调用DoSomething(&Obje
class Object
{
public:
Object* operator&(Object object) { return &object; }
};
这显然只是一个循环,无法指定我想要的是基本的&运算符,而不是覆盖的。当我调用DoSomething(&Object())时,它也没有被调用。这可能吗?这将使初始化复杂类型变得更容易,因此它有点重要。在C++11中可以这样做:
class Object
{
public:
};
Object* operator&(Object&& object) { return std::addressof(object); }
Object const* operator&(Object const&& object) { return std::addressof(object); }
所有对象:
template<typename T>
T* operator&(T&& x) {
return std::addressof(x);
}
模板
T*运算符和(T&&x){
返回std::addressof(x);
}
但请不要这样做。人们会因此讨厌你。在C++11中,你可以这样做:
class Object
{
public:
};
Object* operator&(Object&& object) { return std::addressof(object); }
Object const* operator&(Object const&& object) { return std::addressof(object); }
所有对象:
template<typename T>
T* operator&(T&& x) {
return std::addressof(x);
}
模板
T*运算符和(T&&x){
返回std::addressof(x);
}
但请不要这样做。人们会讨厌它的。 在C++中通常不会这样做。有很多方法可以做到这一点,但这只是自找麻烦。相反,C++解决方案会做:
void DoSomething( Object const& object ){ ... }
void DoSomething( Object& object ){ ... } // operate on an lvalue, object with a name
void DoSomething( Object&& object ){ ... } // operate on an rvalue, either temporary or moved object
但也许您还需要能够对非常量对象进行操作。在这种情况下,您将执行以下操作:
void DoSomething( Object const& object ){ ... }
void DoSomething( Object& object ){ ... } // operate on an lvalue, object with a name
void DoSomething( Object&& object ){ ... } // operate on an rvalue, either temporary or moved object
根据实际你想做的事情,解决方案会有很大的不同。 < P>通常不会在C++中这样做。有很多方法可以做到这一点,但这只是自找麻烦。相反,C++解决方案会做:
void DoSomething( Object const& object ){ ... }
void DoSomething( Object& object ){ ... } // operate on an lvalue, object with a name
void DoSomething( Object&& object ){ ... } // operate on an rvalue, either temporary or moved object
但也许您还需要能够对非常量对象进行操作。在这种情况下,您将执行以下操作:
void DoSomething( Object const& object ){ ... }
void DoSomething( Object& object ){ ... } // operate on an lvalue, object with a name
void DoSomething( Object&& object ){ ... } // operate on an rvalue, either temporary or moved object
根据您实际尝试的操作,解决方案将大不相同。这将是一件非常糟糕的事情!为什么这会让事情变得更容易呢?这不会把地址返回到临时地址吗?很糟糕。是的,我想这不会改变什么,只是暂时的。哦,我想在堆栈上初始化一个复杂的对象结构会很痛苦,那将是一件非常糟糕的事情!为什么这会让事情变得更容易呢?这不会把地址返回到临时地址吗?很糟糕。是的,我想这不会改变什么,只是暂时的。哦,我想在堆栈上初始化一个复杂的对象结构会很痛苦then@K-我想巴洛已经修好了。常量值引用让我感到很不自在。我真正想做的是强制&如果将寄存器值传递给函数,则将其保存到堆栈中。听起来不像是possible@K-我想巴洛已经修好了。常量值引用让我感到很不自在。我真正想做的是强制&如果将寄存器值传递给函数,则将其保存到堆栈中。听起来不像是possible@Ryan布朗:你似乎下定决心要反对这种语言,即使这种语言已经有了捕获和修改临时词的结构。。。我得说你选错了language@Ryan布朗:如果你想要OO,那么你需要
new
那里。。。使用新对象(…)
而不是&对象(…)
。你应该花时间学习语言;或者,如果您没有,请更改为您现在已经使用的语言…”“有时您希望通过引用传递对象,并能够修改对象”--然后您不使用const。有什么问题吗?如果你正在谈论通过临时职位,并且担心复印的成本,那么不要再担心了@RyanBrown:我希望你能发表一篇文章,详细说明为什么你显然认为这两个签名都不适合你的WriteLine
函数:void WriteLine(String8)
,也不适合这个:void WriteLine(const String8&)
——其中任何一条都允许您将调用编写为一条语句:WriteLine(String8(“Exception”)代码>--令人沮丧的是,你甚至没有质疑签名的恰当性WriteLine(String8*)
@Ryan Brown:LOL!只观察const
?@Ryan Brown:你似乎下定决心反对这种语言,即使这种语言已经有了捕获和修改临时变量的结构。。。我得说你选错了language@Ryan布朗:如果你想要OO,那么你需要new
那里。。。使用新对象(…)
而不是&对象(…)
。你应该花时间学习语言;或者,如果您没有,请更改为您现在已经使用的语言…”“有时您希望通过引用传递对象,并能够修改对象”--然后您不使用const。有什么问题吗?如果你正在谈论通过临时职位,并且担心复印的成本,那么不要再担心了@RyanBrown:我希望你能发表一篇文章,详细说明为什么你显然认为这两个签名都不适合你的WriteLine
函数:void WriteLine(String8)
,也不适合这个:void WriteLine(const String8&)
——其中任何一条都允许您将调用编写为一条语句:WriteLine(String8(“Exception”)代码>--令人沮丧的是,你甚至没有质疑签名的恰当性WriteLine(String8*)
@Ryan Brown:LOL!仅遵守常量中的规定
?