首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >操作符()的“显式”和“隐式”调用之间的区别

操作符()的“显式”和“隐式”调用之间的区别
EN

Stack Overflow用户
提问于 2015-06-04 06:31:19
回答 1查看 728关注 0票数 1

在标准中是否有一个子句描述了从基类调用operator ()的方式之间的以下区别?

代码语言:javascript
复制
#include <iostream>
#include <type_traits>

#include <cstdlib>
#include <cassert>

template< typename visitor, typename ...visitors >
struct composite_visitor
    : std::decay_t< visitor >
    , composite_visitor< visitors... >
{

    //using std::decay_t< visitor >::operator ();
    //using composite_visitor< visitors... >::operator ();

    composite_visitor(visitor && _visitor, visitors &&... _visitors)
        : std::decay_t< visitor >(std::forward< visitor >(_visitor))
        , composite_visitor< visitors... >{std::forward< visitors >(_visitors)...}
    { ; }

};

template< typename visitor >
struct composite_visitor< visitor >
    : std::decay_t< visitor >
{

    //using std::decay_t< visitor >::operator ();

    composite_visitor(visitor && _visitor)
        : std::decay_t< visitor >(std::forward< visitor >(_visitor))
    { ; }

};

template< typename visitor, typename ...visitors >
composite_visitor< visitor, visitors... >
compose_visitors(visitor && _visitor, visitors &&... _visitors)
{
    return {std::forward< visitor >(_visitor), std::forward< visitors >(_visitors)...};
}

int
main()
{
    struct A {};
    struct B {};
#if 1
    struct { int operator () (A) { return 1; } } x;
    struct { int operator () (B) { return 2; } } y;
    auto xy = compose_visitors(x, y);
#else
    auto xy = compose_visitors([] (A) { return 1; }, [] (B) { return 2; });
#endif
    // "implicit":
    assert(xy(A{}) == 1);
    assert(xy(B{}) == 2);
    // "explicit":
    assert(xy.operator () (A{}) == 1); // error: member 'operator()' found in multiple base classes of different types
    assert(xy.operator () (B{}) == 2);
    return EXIT_SUCCESS;
}

“隐式”调用编译良好,但不编译“显式”。为什么会这样呢?

compose_visitors通过构造一个派生于所有类的类将参数组合成单个类。

取消对using缺憾的注释将删除硬错误。这是清楚的。

对于lambda函数和函子,这种行为是相同的。

编译器是clang3.6。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-04 06:59:16

“隐式”调用也是不正确的。事实上,GCC rejects it,所以它看起来像是Clang中的一个bug。

标准(N4140,over.all/1)明确指出

调用x(arg1,...)被解释为x.operator()(arg1, ...),如果存在T类型的类对象x,并且通过重载解析机制(13.3.3)选择操作符作为最佳匹配函数(13.3.3)。

因此,这两个调用必须行为相同。

更新:这是Clang中的known issue

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30636541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档