【发布时间】:2016-04-12 14:25:02
【问题描述】:
我试图从一个没有int 构造函数但从nullptr 构造的类派生,试图使派生的构造函数在采用单个参数时尽可能通用。但由于某种原因,似乎没有采用正确的构造函数,即使将 int 替换为模板构造函数会导致失败:
#include <cstddef>
#include <iostream>
struct Base
{
Base(std::nullptr_t){}
Base(){}
// some other constructors, but not from int
};
struct Test : Base
{
Test(std::nullptr_t) : Base(nullptr)
{
std::cerr << "Test(nullptr)\n";
}
template<typename T>
Test(T v) : Base(v) {}
};
int main()
{
Base b=0; // works
Test z=nullptr; // works
Test t=0; // compilation error
}
为什么会这样?这不是 SFINAE 的意思吗?我该如何解决这个问题?
【问题讨论】:
-
使用
template<typename T, typename = decltype(Base(std::declval<T&>()))>获得 SFINAE 效果 -
这里不涉及 SFINAE。
-
长话短说:
0需要转换才能成为nullptr,因此首选模板。 -
您的代码示例所指的编译错误是什么?
-
尤其是
nullptr_t n = 0;的部分