1

为什么static_assert下面会成功?我只是让<<操作员成为朋友,但我还没有在任何地方创建它。

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;
}
4

1 回答 1

2

朋友声明确定操作员存在。如果你使用它,编译器会接受它:

std::cout << foo();

这也是所有断言可以测试的。包含此语句的程序可能不会链接,因为您尚未定义运算符,但就像编译器一样,断言无法检测到这一点。它不知道其他翻译单元是否最终会为该功能提供定义。

编译和链接是不同的阶段。

如果您确实在另一个文件中提供了定义,并且您编译了该文件,那么您可以将两个编译后的文件链接在一起以形成一个完整的程序。您不必重新编译第一个文件。这就是单独编译的全部意义所在。

于 2013-06-28T15:43:22.753 回答