The actual result of name resolution in the class template is different from the c++ 03 standard

前端 未结 3 1621
太阳男子
太阳男子 2021-02-13 11:02

I test the code in the c++ standard ISO/IEC 14882-03 14.6.1/9 on Xcode 4.1 and Visual Studio 2008. The outputs of the two compiler are both different from the expected result of

相关标签:
3条回答
  • 2021-02-13 11:27

    As noted in the first example, this is an instance of two-phase name lookup, which both GCC and Clang implement but MSVC does not. And in this case, both GCC and Clang are correct: it's actually the standard that is wrong, as noted in C++ core defect report #197. The C++11 standard contains a different example.

    This is one of the most common problems we see when porting code to Clang from either MSVC (which never implemented two-phase name lookup) or from GCC (which didn't implement two-phase name lookup uniformly until recently).

    0 讨论(0)
  • 2021-02-13 11:41

    What you're running into is the fact that Visual Studio does not implement two-phase lookup. They only look up the actual name when you instantiate the template.

    And Microsoft has pretty much decided at this point that they're not interested in supporting two-phase lookup.

    0 讨论(0)
  • 2021-02-13 11:45

    I don't know what to tell you except that I would agree with you that this is incorrect behavior.

    I think what's probably happening is that in the case of MSVC, the compiler is optimizing away an extra pass at the cost of ending up with the knowledge of a later-defined function that should not be use in the case of non-template calls. I must confess, I don't get how GCC/LLVM would end up with the results that they do, as the results are what you would expect as the exception and not the rule.

    I guess I'd file it as a bug on http://bugreport.apple.com/ and http://connect.microsoft.com/ and see what they say?

    0 讨论(0)
提交回复
热议问题