简体   繁体   中英

Why does unary operator & not require a complete type?

The following code compiles fine with both gcc 7.2.0 and clang 6.0.0 .

#include <iostream>

struct stru;

void func(stru& s) {
  std::cout << &s << std::endl;
}

int main() {

}

I'm wondering how this is OK. What if stru has overloaded operator&() ? The compiler should not be able to tell with simply a forward declaration like struct stru . In my opinion, only std::addressof(s) is OK with an incomplete type.

What if stru has overloaded operator&() ?

Then it is unspecified whether the overload will be called (See Oliv's comment for standard quote).

How could unary operator & does not require a complete type?

That's how the standard has defined the language. The built-in address-of operator doesn't need to know the definition of the type, since that has no effect on where to get the address of the object.

One consideration for why it is a good thing: Compatibility with C.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM