为什么 static_assert
下面成功了吗?我只做了 <<
operator 是一个 friend ,但我还没有在任何地方创建它。
struct foo {
friend std::ostream &operator<<(std::ostream &stream, const foo &f);
};
template<typename T>
struct bar {
//succeeds:
static_assert(boost::has_left_shift<std::ostream,T>::value, "failure");
};
int main(int,char**) {
bar<foo> b;
return 0;
}
最佳答案
友元声明确定运算符存在。如果你使用它,编译器会接受它:
std::cout << foo();
这也是断言可以测试的所有内容。包含此语句的程序可能不会链接,因为您尚未定义 运算符,但就像编译器一样,断言无法检测到它。它不知道其他翻译单元是否最终会为该功能提供定义。
编译和链接是不同的阶段。
如果您确实在另一个文件中提供了定义,并且您编译了该文件,那么您可以将这两个编译文件链接在一起以形成一个完整的程序。您不必重新编译第一个文件。这就是单独编译的意义所在。
关于c++ - 在测试已声明但未定义的运算符是否存在时,static_assert 真的应该成功吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17368477/