使用std :: is_same,std :: result_of和std :: bind时,static_assert无法按预期工作

时间:2015-06-18 14:04:09

标签: c++ c++11 static-assert

当使用static_assert断言function object的返回类型与另一种类型相同时,我遇到了一种奇怪的行为。类似的东西(这段代码只是用来表示问题而不是我想要做的事情)。

int foo() {
    return 0;
}

int main() {
    auto funcObj = std::bind(foo);
    static_assert(std::is_same<std::result_of<funcObj()>, int>::value, "FuncObj return type is not int");
    return 0;
}

断言失败。这里出了什么问题?

2 个答案:

答案 0 :(得分:3)

std::result_of<?>是一种无用的类型,可以直接使用。

typename std::result_of<?>::typestd::result_of_t<?>(在C ++ 14中)你想要的是什么。

为此类事情获取良好错误消息的简便方法是:

std::result_of<decltype(funcObj)()> x = 3;

应生成错误消息,以明确lhs类型不是您所期望的int。 (无法将int转换为&#39; 某些复杂类型&#39;通常)。

答案 1 :(得分:1)

该行

static_assert(std::is_same<std::result_of<funcObj()>, int>::value, "FuncObj return type is not int");

需要

static_assert(std::is_same<typename std::result_of<decltype(funcObj)()>::type, int>::value, "FuncObj return type is not int");
        // Missing pieces  ^^^^^^^^                                 ^^ ^^^^^^