小编Nia*_*all的帖子

863
推荐指数
7
解决办法
89万
查看次数

我应该通过const-reference传递std :: function吗?

假设我有一个函数,它需要std::function:

void callFunction(std::function<void()> x)
{
    x();
}
Run Code Online (Sandbox Code Playgroud)

我应该x通过const-reference来代替吗?:

void callFunction(const std::function<void()>& x)
{
    x();
}
Run Code Online (Sandbox Code Playgroud)

这个问题的答案是否会根据函数的作用而改变?例如,如果它是一个类成员函数或构造函数,它存储或初始化std::function成成员变量.

c++ reference function

123
推荐指数
3
解决办法
5万
查看次数

我应该为`size_t`包含哪个标题?

根据cppreference.com size_t定义的几个标题,即

<cstddef>
<cstdio>
<cstring>
<ctime>
Run Code Online (Sandbox Code Playgroud)

而且,从C++ 11开始,也在

<cstdlib>
<cwchar> 
Run Code Online (Sandbox Code Playgroud)

首先,我想知道为什么会这样.这与DRY原则是否相矛盾?但是,我的问题是:

我应该使用上面哪个标题来使用size_t?它有关系吗?

c++ typedef

82
推荐指数
4
解决办法
4万
查看次数

C++中的空和空std :: shared_ptr有什么区别?

cplusplus.com shared_ptr页面召唤出一个区分 std::shared_ptr shared_ptr.该cppreference.com页面没有明确叫出区别,但同时使用"空",并比较nullptr其描述std::shared_ptr行为.

空和空之间有区别shared_ptr吗?这种混合行为指针有用例吗?非空null是否shared_ptr有意义?是否会出现正常使用情况(即如果你没有明确构造一个),你最终会得到一个空但非空的shared_ptr

如果您使用的是Boost版本而不是C++ 11版本,那么这些答案中的任何一个都会改变吗?

c++ shared-ptr c++11

75
推荐指数
2
解决办法
1万
查看次数

标准库如何实现std :: swap?

如何在STL中实现交换功能?它是这么简单:

template<typename T> void swap(T& t1, T& t2) {
    T tmp(t1);
    t1=t2;
    t2=tmp;
}
Run Code Online (Sandbox Code Playgroud)

在其他帖子中,他们谈论为您自己的班级专门化这个功能.我为什么要这样做?为什么我不能使用这个std::swap功能?

c++ templates swap

58
推荐指数
2
解决办法
2万
查看次数

Visual Studio代码includePath

我正在尝试在Visual Studio Code中构建C/C++.我安装了C/C++和所有相关的扩展.

#include <stdio.h>
int main() {
    printf("Test C now\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是在#include <stdio.h>"添加包含设置路径" 下面有一条绿线.当我单击它时,它会移动到"c_cpp_properties.json".

我可以在下面的配置中添加包含路径的方式和位置?

"configurations": [
    {
        "name": "Mac",
        "includePath": ["/usr/include"]
    }
]
Run Code Online (Sandbox Code Playgroud)

c c++ visual-studio-code

51
推荐指数
4
解决办法
14万
查看次数

访问NULL指针上的类成员

我正在尝试使用C++,发现下面的代码非常奇怪.

class Foo{
public:
    virtual void say_virtual_hi(){
        std::cout << "Virtual Hi";
    }

    void say_hi()
    {
        std::cout << "Hi";
    }
};

int main(int argc, char** argv)
{
    Foo* foo = 0;
    foo->say_hi(); // works well
    foo->say_virtual_hi(); // will crash the app
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我知道虚方法调用崩溃,因为它需要vtable查找,并且只能使用有效对象.

我有以下问题

  1. 非虚方法如何处理say_hiNULL指针?
  2. 对象在哪里foo分配?

有什么想法吗?

c++ null virtual null-pointer

48
推荐指数
4
解决办法
2万
查看次数

带返回的C++析构函数

在C++中,如果我们将类析构函数定义为:

~Foo(){
   return;
}
Run Code Online (Sandbox Code Playgroud)

在调用这个析构函数时,将Foo被销毁的对象或者从析构函数显式返回的对象意味着我们不想破坏它.

我想这样做只有通过另一个对象析构函数才能销毁某个对象,即只有当另一个对象准备被销毁时才会销毁.

例:

class Class1{
...
Class2* myClass2;
...
};

Class1::~Class1(){
    myClass2->status = FINISHED;
    delete myClass2;
}

Class2::~Class2(){
    if (status != FINISHED) return;
}
Run Code Online (Sandbox Code Playgroud)

我在网上搜索,似乎无法找到我的问题的答案.我也尝试通过使用调试器逐步完成一些代码来自己搞清楚,但无法得到确定的结果.

c++ destructor return c++11 c++14

39
推荐指数
5
解决办法
8944
查看次数

最终用于C++中的优化?

class A {
public:
    virtual void f() = 0;
};

class B : public A {
public:
    void f() final override { };
};

int main() {
    B* b = new B();
    b->f();
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,编译器是否仍需要执行v表查找b->f();,或者是否可以B::f()直接调用,因为它已被标记final

c++ virtual final c++11

39
推荐指数
1
解决办法
5833
查看次数

为什么要使用完美转发的值(仿函数)?

C++ 11(和C++ 14)引入了针对通用编程的其他语言结构和改进.这些功能包括:

  • R值参考
  • 参考折叠
  • 完美转发
  • 移动语义,可变参数模板等

我在浏览较早草案的的C++ 14规范(现在更新文本)和码中的示例中§20.5.1,编译时整数序列,我发现有趣和奇特.

template<class F, class Tuple, std::size_t... I>
decltype(auto) apply_impl(F&& f, Tuple&& t, index_sequence<I...>) {
  return std::forward<F>(f)(std::get<I>(std::forward<Tuple>(t))...);
}

template<class F, class Tuple>
decltype(auto) apply(F&& f, Tuple&& t) {
  using Indices = make_index_sequence<std::tuple_size<Tuple>::value>;
  return apply_impl(std::forward<F>(f), std::forward<Tuple>(t), Indices());
}
Run Code Online (Sandbox Code Playgroud)

在线这里[intseq.general]/2.

  • 为什么功能fapply_impl被转发,即为什么std::forward<F>(f)(std::get...
  • 为什么不直接应用该功能f(std::get...

c++ perfect-forwarding c++11 c++14

32
推荐指数
2
解决办法
1521
查看次数