【发布时间】:2017-10-23 00:49:54
【问题描述】:
这是格式错误还是只是编译器(在我的情况下为 g++-7)仍然存在错误?因为它说n 没有定义。
template<class T>
auto tup(T const& t)
{
if constexpr(hana::length(t)() % 2)
auto n = hana::append(t, nullptr);
else
auto const& n = t;
return n;
}
int main()
{
std::cout << hana::length(tup(std::tuple(3, "h", 'c'))) << '\n';
}
n 将始终被定义,无论编译器将转到哪个分支。
【问题讨论】:
-
如果
if constexpr的作用域规则与if语句的标准作用域规则相匹配,则此错误是有意义的,因为变量声明的作用域仅限于if或@ 的主体987654327@。但我不知道if constexpr应该如何工作,因此不知道这是否应该发生。 -
格式不正确。如果那些
auto声明甚至被编译,我会感到惊讶,除非周围有{...}块,但无论如何,变量会随着它们的范围消失,它们在else和;之前终止于@987654333分别@声明, -
请注意,您可以只使用两个
return语句。废弃的return语句不影响对占位符返回类型的推导。 -
@Peregring-lk 当然不是。我不知道你从哪里得到这个想法。它是一种编译语言,而不是剪贴板。
-
如果
if constexpr()允许在模板化方法或函数中使用局部变量的替代声明,那将是很好的,这取决于传入的类型。如:if constexpr(std::is_same_v<T,short>) typedef int intermediate; else typedef long long intermediate;所以如果 T 是 int,intermediate 将会是 long long,但如果 T 是 short,intermediate 会是 int。当然,这可以通过辅助模板结构轻松实现,但如果可以避免这些结构,那就太好了。