C++ 模板短路逻辑 AND (&&)

c++ template short circuit logic AND (&&)

有人告诉我模板中的 logic AND (&&) 不起作用,所以我想使用模板专业化来实现它。

我的测试代码如下:

#include <iostream>

template <bool b1, bool b2>
constexpr static bool andVal = false;

// template specialization
template <bool b2>
constexpr static bool andVal<true, b2> = b2;

int main(int argc, char *argv[]) {
  std::cout << andVal<1, 1> << std::endl;
  std::cout << andVal<0, 1> << std::endl;
  std::cout << andVal<0, 0> << std::endl;
  std::cout << andVal<1, 0> << std::endl; // this line will cause compilation error
  return 0;
}

但是当我编译代码时,出现了这样的错误:

/tmp/ccaqDdfO.s: Assembler messages:
/tmp/ccaqDdfO.s:369: Error: symbol `_ZL6andVal' is already defined

如果我注释最后一行测试代码std::cout << andVal<1, 1> << std::endl;,编译成功,测试结果正确。

模板函数有什么问题?为什么它已经被定义了?

任何答复将不胜感激!

模板没问题。这是 gcc 版本 5.4 到 6.1 中的错误:template specialization compile error。您恰好处于有问题的版本范围的底部。