【发布时间】:2017-08-27 16:45:17
【问题描述】:
考虑这个程序:
#include <iostream>
#include <type_traits>
using namespace std;
struct russell {
template <typename barber,
typename = typename enable_if<!is_convertible<barber, russell>::value>::type>
russell(barber) {}
};
russell verify1() { return 42L; }
russell verify2() { return 42; }
int main ()
{
verify1();
verify2();
cout << is_convertible<long, russell>::value;
cout << is_convertible<int, russell>::value;
return 0;
}
如果某些类型 barber 不能转换为 russell。我们试图通过使其可转换(启用转换构造函数)来创建一个悖论。
输出是00,带有三个流行的编译器,尽管构造函数显然在工作。
我怀疑行为应该是未定义的,但在标准中找不到任何东西。
这个程序的输出应该是什么,为什么?
【问题讨论】:
-
@Barry 是的,这看起来很受骗......
-
@Barry 我偷偷地添加了我的答案,因为我在看了很长时间并最终完成答案后感到恐慌。如果您认为这更明智,我可以重写它以适合您的问题并将其发布到那里。
-
@Columbo 我不知道什么更明智,但我很确定无论你决定做什么,我都会投赞成票。甚至可能想扭转欺骗的方向?
-
@Barry 我故意再次欺骗它,因为你的问题有不可否认的相似之处。我会保留它现在的样子。
标签: c++ language-lawyer template-meta-programming