为什么默认模板参数只允许在类模板上?为什么我们不能在成员函数模板中定义默认类型?例如:
struct mycclass {
template<class T=int>
void mymember(T* vec) {
// ...
}
};
Run Code Online (Sandbox Code Playgroud)
相反,C++强制只允许在类模板上使用默认模板参数.
我今天去了一个面试,并得到了这个有趣的问题.
除了内存泄漏和事实上没有虚拟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) 智能指针如何处理数组?例如,
void function(void)
{
std::unique_ptr<int> my_array(new int[5]);
}
Run Code Online (Sandbox Code Playgroud)
当my_array超出范围并被破坏时,整个整数数组是否会被重新声明?只回收了数组中的第一个元素吗?或者还有其他事情发生(例如未定义的行为)?
在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表达式真的很方便,有没有办法解决这些问题?
我在类中有一个void函数.在旧的C++中,我将一个函数静态化,将类名作为参数,并拥有自己的类,它使用静态void函数+一个void*来轻松调用它.
然而,感觉老派.它也没有模仿,感觉我可以做得更多.什么是更现代的方法来创建myclassVar.voidReturnVoidParamFunc的回调
如果我有一个带有n个参数的构造函数,那么任何参数都可以是rvalue和lvalue.是否可以通过为rvalues移动语义来支持这一点,而无需为每个可能的rvalue/lvalue组合编写2 ^ n个构造函数?
我一直在阅读一些矛盾的文章,关于是否允许移动构造函数/赋值.
因此,我想问一下移动构造函数/赋值是否允许抛出最终的C++ 11标准?
我试图想出一个具体的推理,为什么要在引用上使用指针作为函数的返回类型,
我的理由是,如果无意中将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)
任何想法将再次受到赞赏,
你会用什么以及为什么引用或指针
提前致谢.
如果一个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) 有没有办法让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)