【发布时间】:2019-08-09 07:22:58
【问题描述】:
给定以下代码:
template<typename T>
constexpr remove_reference_t<decltype(T{}.x, bool{})> has_x() {return true;}
template<typename T, class... U>
constexpr bool has_x(U...) {return false;}
class A { public: int x; };
int main()
{
vector<int> vec;
A my_a{};
std::cout << has_x<decltype(my_a)>() << endl << has_x<decltype(vec)>() << endl;
if constexpr(has_x<decltype(vec)>())
{
cout << vec.x << endl;
}
else
{
cout << size(vec) << endl;
}
}
只有当我注释掉 cout << vec.x << endl 时它才会编译。这显然不会编译,但我对if constexpr 的理解是:
如果值为
true,则丢弃statement-false(如果存在),否则丢弃statement-true
因此,我认为应该丢弃“statement-true”,但似乎并非如此。如果我在“statement-true”中放置一个在任何一种情况下都有效的陈述,它就会起作用。但是我得到一个可能无效的声明:
错误:
class std::vector<int>没有名为x的成员
我在这里做错了吗?
【问题讨论】:
-
@SidS 我不明白,
has_x<decltype(vec)>()不是一个有效条件吗? -
if constexpr在模板之外失去了它的魔力(条件也必须依赖于模板参数)。 -
您不能将无效代码放入
if constexpr,即使在“false”分支中也是如此。 -
@HolyBlackCat 这几乎是真的,但并不完全正确。丢弃子语句可以防止它使用它引用的实体。
-
例如:godbolt.org/z/g6NQXV 条件永远不会为真,但仍然会触发错误,即使没有实例化。 GCC 错误地接受了这一点。
标签: c++ reflection metaprogramming compile-time if-constexpr