小编RTe*_*ete的帖子

为什么std :: function构造函数或赋值之间有区别?

std::function类型擦除构造被定义为:

template< class F >
function( F f );
Run Code Online (Sandbox Code Playgroud)

赋值运算符定义为:

template< class F >
function& operator=( F&& f );
Run Code Online (Sandbox Code Playgroud)

(来源cppreference)

为什么构造函数获得f由价值而operator=获得f通过转发的参考?

c++ perfect-forwarding c++11 std-function

8
推荐指数
1
解决办法
221
查看次数

Visual C++:在明显的情况下没有虚拟化?

在观看由visual c ++(VS2017 RC)生成的代码以便在简单情况下查看动态分支(虚拟调用)时,我感到非常惊讶.

所以我用编译器资源管理器尝试了以下代码:

struct Base
{
  virtual void foo() = 0;
};

struct Impl : Base
{
void foo() override;
};

Impl g_impl;
void globalCall()
{
  g_impl.foo();
}

void localCall()
{
  Impl i;
  i.foo();
}

void tempCall()
{
  Impl().foo(); // dynamic branching generated!
}

struct Class
{
  void memberCall();
  Impl impl;
};

void Class::memberCall()
{
  impl.foo(); // dynamic branching generated!
} 
Run Code Online (Sandbox Code Playgroud)

编译器资源管理器链接:https: //godbolt.org/g/RmUku2

对于临时和成员案例,看起来没有发生虚拟化.那么它是编译器质量的实现问题,还是有这种结果的技术上有效的原因?

c++ compiler-optimization visual-studio

6
推荐指数
1
解决办法
170
查看次数

嵌套在函数中的函数声明的命名空间

出于奇怪的原因,我想在函数作用域内声明一个函数。所以我得到以下代码:

namespace NS
{
    void foo()
    {
        void bar();
        bar();
    }
}
Run Code Online (Sandbox Code Playgroud)

在另一个编译单元中,我想定义 bar. 根据我使用的编译器,我需要将 bar 放入命名空间 NS 或全局命名空间中才能链接:

叮当声:

namespace NS
{
    void bar() {}
}
Run Code Online (Sandbox Code Playgroud)

在 MSVC 上:

void bar() {}
Run Code Online (Sandbox Code Playgroud)

如果有的话,什么是好的行为?

作为一个附带问题,为什么以下代码都无法编译(在我的 2 个编译器上):

namespace NS
{
    void foo()
    {
        void bar();
        ::bar(); // bar declared in global namespace
    }
}
Run Code Online (Sandbox Code Playgroud)

或者

namespace NS
{
    void foo()
    {
        void bar();
        ::NS::bar(); // bar declared in NS namespace
    }
}
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助。

吉西尔贝

c++ namespaces forward-declaration language-lawyer

5
推荐指数
1
解决办法
264
查看次数