Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;覆盖地址运算符 我希望能够在C++标准编译器中做到这一点: void DoSomething(Object* object) { } DoSomething(&Object())_C++_Operator Keyword - Fatal编程技术网

C++;覆盖地址运算符 我希望能够在C++标准编译器中做到这一点: void DoSomething(Object* object) { } DoSomething(&Object())

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

使用默认地址运算符,它将把构造的对象保存到寄存器中,然后在DoSomething()中覆盖它。。。对于所有对象(除了不能覆盖它们的基类型),在一行中完成这项工作会非常好

这就是我所拥有的:

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!仅遵守
常量中的规定