一个简单的问题:能否有人解释一下这段代码是如何工作的?(来自这里https://alexpolt.github.io/type-loophole.html)
#include <string>
#include <type_traits>
template<int N> struct tag{};
template<typename T, int N>
struct loophole_t {
friend auto loophole(tag<N>) { return T{}; };
};
auto loophole(tag<0>);
int main() {
sizeof( loophole_t<std::string, 0> );
static_assert(std::is_same< std::string, decltype( loophole(tag<0>{}) ) >::value);
}
看起来 sizeof( loophole_t<std::string, 0> );
影响编译器的全局状态。我的意思是,如果我们删除这行代码,static_asserts
将会失败。C++允许这种情况吗?
更新: 刚刚意识到它取决于编译器甚至编译器版本。 在任何GCC >=8(可能也适用于早期版本)中都可以很好地工作。 在clang >= 10中无法编译,但在clang 7.0中可以正常工作。
所以我的真正问题是:这是编译器 bug 还是标准行为?
friend
的普遍bug问题 - Asteroids With Wings