相关疑难解决方法(0)

static_assert依赖于非类型模板参数(gcc和clang上的不同行为)

template <int answer> struct Hitchhiker {
  static_assert(sizeof(answer) != sizeof(answer), "Invalid answer");
};

template <> struct Hitchhiker<42> {};
Run Code Online (Sandbox Code Playgroud)

在尝试禁用常规模板实例化的同时,static_assert我发现clang即使模板未实例化,上面的代码也会生成断言错误,而gcc只有在Hitchhiker使用除了以外的参数进行实例化时才生成断言错误42.

摆弄我发现这个断言:

template <int answer> struct Hitchhiker {
  static_assert(sizeof(int[answer]) != sizeof(int[answer]), "Invalid answer");
};

template <> struct Hitchhiker<42> {};
Run Code Online (Sandbox Code Playgroud)

两个编译器的行为相同:只有在实例化通用模板时,断言才会启动.

标准说什么,哪个编译器是对的?

g++ 4.9.2
clang++ 3.50
Run Code Online (Sandbox Code Playgroud)

c++ templates dependent-name language-lawyer c++14

25
推荐指数
2
解决办法
1136
查看次数

是否允许编译器评估静态断言中的重言式

提供static_assert模板通常很有帮助.在模板不应该以某种方式实例化的情况下,我经常这样做

template<typename T, typename = void>
struct S
{
    static_assert(false, "Unconditional error");
    static_assert(sizeof(T) != sizeof(T), "Error on instantiation");
};

template<typename T>
struct S<T, std::enable_if_t<std::is_integral_v<T>>>
{
    // ...
};
Run Code Online (Sandbox Code Playgroud)

static_assert即使没有实例化,第一个将立即失败S,而如果没有实例化将导致主模板,第二个将成功.

第二个static_assert显然是一个重言式,但它"取决于" T,以达到预期的效果.但这有保证吗?是否允许编译器评估这些重言式?

c++ static-assert language-lawyer

9
推荐指数
1
解决办法
200
查看次数

什么是std :: false_type或std :: true_type?

我看到它的用法如下

template <typename T>
struct DependentFalse : std::false_type
{};
Run Code Online (Sandbox Code Playgroud)

然后,在这里使用

template <typename T>
class RadarSensor
{
    static_assert(DependentFalse<T>::value, "RadarSensor must be created using Identifier template");
};
Run Code Online (Sandbox Code Playgroud)

我不知道它的用途是什么?

什么是DependentFalse结构?

c++ c++-standard-library c++11

1
推荐指数
1
解决办法
125
查看次数