我的类有一个重载operator&
,如果参数是一个指针,我会做一个静态断言。
class test {
public:
template<typename T>
friend inline test& operator&(test& so, T const& t) {
std::cout << "is_pointer : " << std::is_pointer<T>::value << std::endl;
static_assert(std::is_pointer<T>::value, "no operator overloaded for pointers.");
// some stuff
}
};
现在,如果我使用此运算符,即使类型最终不是指针,我总是得到断言。但为什么? std::cout << "is_pointer : " << std::is_pointer<T>::value << std::endl;
给我打印零......
int main() {
test t;
t & 123;
return 0;
}
有关正在运行的示例,请参阅here。
答案 0 :(得分:4)
当然断言失败了。您要求类型T
是指针,但T
这里是int
。
也许你的意思是以下几点?
// Ensure that `T` is not a pointer
static_assert(!std::is_pointer<T>::value, "no operator overloaded for pointers");
断言是确保特定条件的陈述。它不完全&#34;如果X然后输出错误消息Y&#34 ;;事实上,它恰恰相反。 :)
答案 1 :(得分:1)
您断言传递的类型是指针。如果您传递的内容 not 指针,则static_assert()
会失败并收到消息。看来,你想要正确地否定条件不想要使用指针:
static_assert(!std::is_pointer<T>::value, "no operator overloaded for pointers.");
答案 2 :(得分:0)
当且仅当T
不是指针时,听起来你想要编译它。在原始表达式中,断言T
是指针。
基本上,static_assert
表示“我的第一个参数更好,否则我会在编译时以第二个参数作为错误消息抱怨。”
你似乎想要什么:
class test {
public:
template<typename T>
friend inline test& operator&(test& so, T const& t) {
static_assert(! std::is_pointer<T>::value, "no operator overloaded for pointers.");
// some stuff
}
};