小编Luc*_*ton的帖子

函数模板的默认模板参数

为什么默认模板参数只允许在类模板上?为什么我们不能在成员函数模板中定义默认类型?例如:

struct mycclass {
  template<class T=int>
  void mymember(T* vec) {
    // ...
  }
};
Run Code Online (Sandbox Code Playgroud)

相反,C++强制只允许在类模板上使用默认模板参数.

c++ templates

183
推荐指数
3
解决办法
6万
查看次数

指向base的指针可以指向派生对象数组吗?

我今天去了一个面试,并得到了这个有趣的问题.

除了内存泄漏和事实上没有虚拟dtor,为什么这个代码会崩溃?

#include <iostream>

//besides the obvious mem leak, why does this code crash?

class Shape
{
public:
    virtual void draw() const = 0;
};

class Circle : public Shape
{
public:
    virtual void draw() const { }

    int radius;
};

class Rectangle : public Shape
{
public:
    virtual void draw() const { }

    int height;
    int width;
};

int main()
{
    Shape * shapes = new Rectangle[10];
    for (int i = 0; i < 10; ++i)
        shapes[i].draw();
}
Run Code Online (Sandbox Code Playgroud)

c++ pointers

98
推荐指数
3
解决办法
4489
查看次数

智能指针和数组

智能指针如何处理数组?例如,

void function(void)
{
    std::unique_ptr<int> my_array(new int[5]);
}
Run Code Online (Sandbox Code Playgroud)

my_array超出范围并被破坏时,整个整数数组是否会被重新声明?只回收了数组中的第一个元素吗?或者还有其他事情发生(例如未定义的行为)?

c++ smart-pointers c++11

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

C++ 14中的递归lambda函数

在C++ 11中编写递归lambda函数有一个经常重复的"技巧",如下所示:

std::function<int(int)> factorial;
factorial = [&factorial](int n)
{ return n < 2 ? 1 : n * factorial(n - 1); };

assert( factorial(5) == 120 );
Run Code Online (Sandbox Code Playgroud)

(例如,C++ 0x中的递归lambda函数.)

这种技术有两个直接的缺点:std::function<Sig>对象的目标(通过引用捕获)与非常特定的std::function<Sig>对象(此处factorial)相关联.这意味着通常无法从函数返回生成的仿函数,否则引用将保持悬空状态.

另一个(尽管不那么直接)问题是使用std::function通常会阻止编译器优化,这是在其实现中需要类型擦除的副作用.这不是假设,可以很容易地进行测试.

在假设的情况下,递归lambda表达式真的很方便,有没有办法解决这些问题?

c++ lambda c++14

44
推荐指数
2
解决办法
6646
查看次数

C++ 11风格的回调?

我在类中有一个void函数.在旧的C++中,我将一个函数静态化,将类名作为参数,并拥有自己的类,它使用静态void函数+一个void*来轻松调用它.

然而,感觉老派.它也没有模仿,感觉我可以做得更多.什么是更现代的方法来创建myclassVar.voidReturnVoidParamFunc的回调

c++ c++11

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

在C++ 0x中传递/移动构造函数的参数

如果我有一个带有n个参数的构造函数,那么任何参数都可以是rvalue和lvalue.是否可以通过为rvalues移动语义来支持这一点,而无需为每个可能的rvalue/lvalue组合编写2 ^ n个构造函数?

c++ rvalue-reference move-constructor c++11

25
推荐指数
1
解决办法
3989
查看次数

移动构造函数是否必须是noexcept?

我一直在阅读一些矛盾的文章,关于是否允许移动构造函数/赋值.

因此,我想问一下移动构造函数/赋值是否允许抛出最终的C++ 11标准?

c++ noexcept c++11

18
推荐指数
2
解决办法
2593
查看次数

指针与参考返回类型

我试图想出一个具体的推理,为什么要在引用上使用指针作为函数的返回类型,

我的理由是,如果无意中将null值返回给引用类型,则无法检查它,并可能导致运行时错误

  int& something(int j)
  {
      int* p = 0 ;  
      return *p;
  }

  void main()
  {
      int& i = something(5);
      i = 7;   // run-time error 
  }
Run Code Online (Sandbox Code Playgroud)

如果我使用了指针,我可以检查它并避免错误,指针返回值将作为合同,必须返回一个值.

 void main()
 {
         int* i = something(5);
         if( i != null )
             *i = 7;
 }
Run Code Online (Sandbox Code Playgroud)

任何想法将再次受到赞赏,

你会用什么以及为什么引用或指针

提前致谢.

c++ pointers reference

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

测试lambda是否是无状态的?

如果一个lambda是无状态的,也就是说,如果它捕获了任何东西,我将如何进行测试?我的猜测是使用带有函数指针重载或模板特化的重载解析?

int a;
auto l1 = [a](){ return 1; };
auto l2 = [](){ return 2; };
// test l1 and l2, get a bool for statelessness.
Run Code Online (Sandbox Code Playgroud)

c++ lambda c++11 c++14

13
推荐指数
3
解决办法
2275
查看次数

static_assert - 一种动态自定义错误消息的方法

有没有办法让static_assert的字符串动态定制然后显示?
我的意思是:

//pseudo code
static_assert(Check_Range<T>::value, "Value of " + typeof(T) + " type is not so good ;)");
Run Code Online (Sandbox Code Playgroud)

c++ static-assert c++11

12
推荐指数
3
解决办法
6065
查看次数