On 3/30/20 5:17 PM, Pham wrote:
On Monday, 30 March 2020 at 18:20:00 UTC, Steven Schveighoffer wrote:
I don't really understand the question about "nothrow".


void main()
{
     static class Foo { int i; }

     static bool checkFoo() nothrow
     {
         // error when compile
         //return typeid(Foo) == Foo.classinfo;

         // ok when compile
         return typeid(Foo) is Foo.classinfo;
     }

     checkFoo();
}

In this case, the difference is == vs. `is`, not classinfo vs typeid:

typeid(Foo) == typeid(Foo); // throws

Foo.classinfo == Foo.classinfo; // throws

typeid(Foo) is typeid(Foo); // nothrow

Foo.classinfo is Foo.classinfo; // nothrow

`is` between class instances means "is this the same instance". It is a simple comparison of two pointers basically.

== between classes means calling object.opEquals [1], which is not nothrow (or nogc, or pure).

In fact, they should be the same instance, because typeid and classinfo do the same thing.

-Steve

[1] https://dlang.org/phobos/object.html#.opEquals

Reply via email to