c++ - 在测试已声明但未定义的运算符是否存在时,static_assert 真的应该成功吗?

标签 c++ templates boost static-assert

为什么 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/

相关文章:

C++ 如何隐藏公共(public)类?

c++ - 类中的静态字符串常量与常量的命名空间 [c++]

c++ - 内存管理 : Returning a vector element and deleting(pop_back) it

c++ - C++中可能进行以下编译时编程任务

c++ - 哪种整数数据类型最有效地使用 x64 CPU 内核?

c++ - 使用 getProcAddress 在导出的 DLL 函数中实例化一个类

templates - 在 Underscore.js 模板中使用 <% 而不解析它

c++ - 使用 boost::pool_allocator 时不调用 move 构造函数

C++ - 智能指针 - 通过模板将派生类共享指针传递给基类

c++ - 如何在不等待新数据到达的情况下使用 boost::asio 的 async_read_some() 读取所有可用数据?