gpt4 book ai didi

c++ - 当相同的约束必须推导不同的类型时,为什么将概念放入类型说明符会导致类型推导失败?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:26:40 26 4
gpt4 key购买 nike

我们有:

template <typename ...T> concept bool Numerics = ( std::is_arithmetic_v<T> && ... ) ;
template <typename T> concept bool Numeric = std::is_arithmetic_v<T>;

然后我们让编译器推导出所有的数字:

template <typename T, typename U, typename V, typename W> requires Numerics<T,U,V,W>
auto foo(T arg1, U arg2, V arg3, W arg4) {
return 0.0 + arg1 + arg2 + arg3 + arg4;
}

std::cout << foo (1,2.0,3.0f,4.0l) << "\n";

编译器像预期的那样推导所有参数类型:

auto foo<int, double, float, long double>(int, double, float, long double):

当我们尝试将约束分布到类型说明符中以编写较短的版本时:

auto foo2(Numeric arg1, Numeric arg2, Numeric arg3, Numeric arg4) {
return 0.0 + arg1 + arg2 + arg3 + arg4;
}

尽管如此,编译器出人意料地未能推断出这一点:

// err: deduction fails
//
// std::cout << foo2(1,2,3,4.0) << "\n";

似乎编译器试图将所有推导成相同的类型,这里肯定失败了。

为什么?编译器不应该能够从相同的约束中推导出不同的类型吗?

LIVE

最佳答案

这是 Concepts TS 中比较有争议的方面之一。当你说

template <typename T> concept bool C = true;

template <C T, C U>
void func(T t, U u);

这被翻译成好像你说过

template <typename T, typename U> requires (C<T> && C<U>)
void func(T t, U u);

但是,当你使用“缩写语法”来表示

void func(C t, C u); 

这被翻译成好像你说过

template <typename T> requires C<T>
void func(T t, T u);

许多人认为这是违反直觉的,并且有一个 proposal to change it .然而,其他人(包括 Bjarne Stroustrup 本人)赞成“一致演绎”——参见 Stroustrup 的论文 here .

在撰写本文时,纳入 C++20 草案的 Concepts TS 子集不包含缩写语法。目前尚不清楚它是否会在 20 年结束,如果是,它将使用什么样的推论——争论仍有待解决。

关于c++ - 当相同的约束必须推导不同的类型时,为什么将概念放入类型说明符会导致类型推导失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48341724/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com