【问题标题】:How does D solve this issue with return types?D 如何用返回类型解决这个问题?
【发布时间】:2023-03-17 17:25:02
【问题描述】:

C++11 引入了新的函数声明语法,

auto func(T rhs, U lhs) -> V

这是为了解决在旧的 C++ 标准中出现的一些问题。有关该问题的详细信息,请阅读此简短的 Wikipedia 文章部分:
> http://en.wikipedia.org/wiki/C%2B%2B11#Alternative_function_syntax

我的问题是,D 是否面临同样的问题?如果是这样,它如何解决它(如果有的话)?

【问题讨论】:

    标签: function syntax d


    【解决方案1】:

    在 D 中,编译器可以为您推断返回类型。所以不需要-> V 语法。

    auto func(T, U)(T lhs, U rhs) { return lhs + rhs; }
    

    或者如果您想更具体(但最好让编译器用auto! 找出类型!)

    typeof(T.init + U.init) func(T, U)(T lhs, U rhs) { return lhs + rhs; }
    

    和 C++ 一样,你不能在那个地方使用 typeof(lhs + rhs)

    【讨论】:

    • 如何处理多个return语句的情况? (我想如果它们是不同的类型,它会发出错误。:-))
    • @PaulManta:目前,返回类型将设置为遇到的第一个return 语句的类型。然后所有其他 return 语句必须是相同的类型。如果某些return 语句具有不同的类型,DMD-FE 将引发“函数返回类型推断不匹配”错误。
    【解决方案2】:

    我不是 100% 确定,但我相信您可以使用 typeof(<expression>) 语法。所以应该可以这样做:typeof(rhs+lhs) func(T rhs, U lhs) { /* body */ }

    【讨论】:

    • 那么D在返回类型之前解析参数列表?
    • @Paul Manta 声明的顺序在 D 中通常并不重要(当然,除了在函数体内)。很明显,编译器是从左到右解析的,但是声明的语义分析是在后面完成的,所以typeof(rhs+lhs)rhslhs被声明之前是没有意义的。
    • 正如 KennyTM 在他的回答中指出的那样,你不能这样做 typeof(rhs + lhs) 但你可以这样做 typeof(T.init + U.init)
    • 是的,这是一个快速编辑。正如我所写,我不是 100% 确定的。 :) 所以是的,typeof(T.init + U.init) fun(T l, U r) {} 是个好方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 2022-10-18
    • 2014-10-07
    • 1970-01-01
    相关资源
    最近更新 更多