C++ decltype(自动)返回类型不能在clang中推断

C++ decltype(自动)返回类型不能在clang中推断,c++,clang,c++14,return-type,auto,C++,Clang,C++14,Return Type,Auto,我目前正在处理boost asio中的组合操作,无法理解为什么clang似乎无法推断我的get\u executor()方法的返回类型: template<class Stream, class Resolver, class CompletionToken> auto resolve_and_connect( std::string_view host, std::string_view port, Stream& stream, Resol

我目前正在处理boost asio中的组合操作,无法理解为什么clang似乎无法推断我的
get\u executor()
方法的返回类型:

template<class Stream, class Resolver, class CompletionToken>
auto resolve_and_connect(
    std::string_view host,
    std::string_view port,
    Stream& stream,
    Resolver& resolver,
    CompletionToken&& token)
{
    using Signature = void(boost::system::error_code);
    using Handler = BOOST_ASIO_HANDLER_TYPE(CompletionToken, Signature);

    auto initiation = [](auto&& completion_handler, Stream& stream, Resolver& resolver) {
        struct intermediate_handler {
            Handler m_handler;
            Stream& m_stream;

            decltype(auto) get_executor() {
                return net::get_associated_executor(m_handler, m_stream.get_executor());
            }
            // using executor_type = decltype(std::declval<intermediate_handler>().get_executor());
        };

        intermediate_handler{completion_handler, stream};
    };

    return net::async_initiate<CompletionToken, Signature>(
        initiation, token, std::ref(stream), std::ref(resolver)
    );
}
模板
自动解析和连接(
std::string_视图主机,
std::string_视图端口,
溪流&溪流,
分解器和分解器,
CompletionToken(&&token)
{
使用Signature=void(boost::system::error\u代码);
使用Handler=BOOST\u ASIO\u Handler\u类型(CompletionToken,Signature);
自动启动=[](自动和完成处理程序、流和流、解析器和解析器){
结构中间处理器{
Handler m_Handler;
溪流和木屋溪流;
decltype(自动)获取执行器(){
返回网::get_关联的_执行器(m_处理程序,m_stream.get_执行器());
}
//使用executor_type=decltype(std::declval().get_executor());
};
中间处理程序{完成处理程序,流};
};
返回网络::异步\u初始化(
初始化,令牌,std::ref(流),std::ref(解析器)
);
}
在以下情况下失败:

 error: no viable conversion from returned value of type 'typename associated_executor<(lambda at test.cpp:9:71), executor>::type' (aka 'boost::asio::executor') to function return type 'decltype(auto)'
                    return net::get_associated_executor(m_handler, m_stream.get_executor());
                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
错误:从类型为“typename associated_executor::type”(也称为“boost::asio::executor”)的返回值到函数返回类型“decltype(auto)”没有可行的转换
返回网::get_关联的_执行器(m_处理程序,m_stream.get_执行器());
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
使用
clangversion10.0.0-4ubuntu1
-std=c++17
编译


注意
namespace net=boost::asio隐含在上述代码中。

您是否尝试过在gcc中编译?想知道它的信息是什么会很有趣。@Taekahn有趣的是:gcc 9.3.0只是编译了它fine@Taekahn是的,你说得对,这对我来说很有用。不过这有点破坏了这一点,特别是因为
decltype(auto)
的行为应该与此完全相同。已经有报道但没有引起太多注意的叮当声:(