【发布时间】:2015-09-25 12:15:51
【问题描述】:
如何在模板变量定义中引入static_assert?
我的尝试是使用 lambda 函数:
#include <type_traits>
#include <utility>
#include <cstdlib>
namespace
{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wglobal-constructors"
template< typename F >
F f = ([] () { static_assert(std::is_default_constructible< F >{}); }(), F{});
#pragma clang diagnostic pop
}
struct L
{
L() = default;
L(L const &) = delete;
L(L &&) = delete;
};
int
main()
{
static_cast< void >(f< L >);
return EXIT_SUCCESS;
}
但是对于不可移动的对象,不可能以这种方式构造值对象。
使用逗号运算符我无法以F f = ([] () { static_assert(std::is_default_constructible< F >{}); }(), {}); 形式执行值初始化。
我不能在表单, typename = decltype([] () { static_assert(std::is_default_constructible< F >()); }) 中使用额外的模板参数,因为它是一个错误lambda expression in an unevaluated operand。
通过 SFINAE 禁用实例化不是解决方案。我确实需要static_assert 明确地向用户说明错误。
如果static_assert 返回void 或bool,那就太好了。
【问题讨论】:
-
template< typename F >class F_class{ static_assert(...); using type=F; }; template< typename F > typename F::type f; -
@zch
structinstad ofclass是对的 -
使用SFINAE,错误信息不是很清楚:(Demo
-
@zch 严格来说我想将
static_assert直接引入到变量模板定义中。 -
为什么?如果它不是默认可构造的,那么变量模板定义无论如何都会告诉你。代码的混淆真的值得稍微更好的错误消息吗?
标签: c++ c++14 typetraits static-assert variable-templates