A. *_* S. 10 c++ new-operator language-lawyer c++11 c++14
请考虑以下代码:
class Foo
{
public:
//class-specific
Foo operator+(Foo& rhs)
{
return Foo(); //Just return a temporary
}
void* operator new(size_t sd)
{
return malloc(sd);
}
};
//global
Foo operator+(Foo& lhs, Foo& rhs)
{
return Foo();
}
void* operator new(size_t sd)
{
return malloc(sd);
}
Run Code Online (Sandbox Code Playgroud)
此代码将无法编译,说明调用不明确,因为它匹配两个运算符:
Foo a, b;
a + b;
Run Code Online (Sandbox Code Playgroud)
但是这个带有new运算符的编译器很好,并且会调用特定于类的运算符.
Foo* a = new Foo();
Run Code Online (Sandbox Code Playgroud)
为什么不导致编译错误?编译器是否以不同方式处理新运算符?(任何对标准的引用都将不胜感激.)
operator new如果定义,则始终首选“类” :
[expr.new]/9如果new表达式以一元开头?
::?运算符,分配函数的名称在全局范围内查找。否则,如果分配的类型是类类型T或其数组,则在的范围内查找分配函数的名称T。如果此查找找不到名称,或者分配的类型不是类类型,则在全局范围内查找分配函数的名称。
读取起来可能很棘手:如果new-expression不是以开头,::并且分配的类型是类类型,则new在类的范围内进行查找。
| 归档时间: |
|
| 查看次数: |
727 次 |
| 最近记录: |