此代码来自Bjarne Stroustrup的"C++编程语言"(C.13.8.3实例化绑定点)
template <class T>
void f(T value)
{
g(value);
}
void g(int v);
void h()
{
extern g(double);
f(2);
}
Run Code Online (Sandbox Code Playgroud)
他提到:
这里,f()的实例化点恰好在h()之前,因此在f()中调用的g()是全局g(int)而不是局部g(double)."实例化点"的定义意味着模板参数永远不能绑定到本地名称或类成员.
void h()
{
struct X {}; // local structure
std::vector<X> v; // error: can't use local structure as template parameter
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:
为什么第一个代码有效?g()稍后声明,我真的得到了G ++ 4.9.2的错误,那时g没有声明.
extern g(double) - 这是如何工作的?因为在函数重载的情况下返回值无关紧要,那么我们可以在前向声明中错过它吗?
f()的实例化点就在h()之前 - 为什么?在f(2)被调用时它会被实例化是不合逻辑的?就在我们称之为的地方,它g(double)已经在范围内了.
"实例化点"的定义意味着模板参数永远不能绑定到本地名称或类成员 - 在C++ 14中是否已更改?我在使用C++(G ++ 4.9.2)时遇到错误,但是在C++ 14(G ++ 4.9.2)中没有出错.
我需要禁用复制赋值运算符.这将有效:
A& operator=(const A&);
Run Code Online (Sandbox Code Playgroud)
如果我没有指定确切的参数,它会工作operator=吗?
我的意思是这样的:
void operator=(void);
Run Code Online (Sandbox Code Playgroud)
返回值是正确的,我可以写任何我想要的,但参数类型怎么样?
这会覆盖operator=类的默认值吗?
我知道用户应用程序只能在用户模式下运行,这是为了系统安全。相反,大多数驱动程序在内核模式下运行,以访问 I/O 设备。尽管如此,一些驱动程序在用户模式下运行,但允许访问 I/O 设备。所以我有以下问题。驱动程序和用户应用程序之间的主要区别是什么?不能像某些驱动程序那样允许用户应用程序访问 I/O 设备吗?
谢谢。
我正在检查visual studio 2013中的硬件和软件异常.我知道我可以通过将"启用C++异常"选项设置为/ EHa来捕获硬件异常(是的,使用SEH异常).我试图抓住以下例外情况:
EXCEPTION_ARRAY_BOUNDS_EXCEEDED - 没有抓住
EXCEPTION_ACCESS_VIOLATION - 抓住了
EXCEPTION_INT_OVERFLOW - 没有抓住
EXCEPTION_INT_DIVIDE_BY_ZERO - 被抓住了
这是代码的一个例子.
try {
a = std::numeric_limits<int>::max();
a += 5;
}
catch (...){
std::cout << "EXCEPTION_INT_OVERFLOW Exception Caught" << std::endl;
exit(1);
}
try {
int h = 0;
b = b / h;
}
catch (...){
std::cout << "EXCEPTION_INT_DIVIDE_BY_ZERO Exception Caught" << std::endl;
exit(1);
}
Run Code Online (Sandbox Code Playgroud)
它只捕获除零异常.这是处理器的依赖还是还有别的?还有一个小问题,调试和发布版本之间有什么区别吗?
我有一个简单的程序:
struct B
{
virtual ~B() {}
};
struct D : public B
{
~D() {}
};
Run Code Online (Sandbox Code Playgroud)
所以,当我打电话的时候
B* b = new D;
b->~B();
Run Code Online (Sandbox Code Playgroud)
为什么派生类的析构函数被称为?它是虚拟的,但是我们按名称调用析构函数,或者是否存在析构函数的隐藏名称,对于所有类都是相同的?
我有这样的类层次结构:
template <class Type>
class CrtpBase
{
protected:
Type& real_this()
{
return static_cast<Type&>(*this);
}
};
template <class ChildType>
class Base : CrtpBase<ChildType>
{
public:
void foo()
{
this->real_this().boo();
}
};
class Derived1 : public Base<Derived1>
{
public:
void boo { ... }
};
class Derived2 : public Base<Derived2>
{
public:
void boo { ... }
};
Run Code Online (Sandbox Code Playgroud)
问题是,我想以这种方式使用我的类:
std::vector<Base*> base_vec;
base_vec.push_bach(new Derived1());
base_vec.push_bach(new Derived2());
.........
base_vec[0]->foo();
Run Code Online (Sandbox Code Playgroud)
但这是不可能的,因为所有派生类的基类是不同的(实际上Base根本不是一个类型,它是模板).那么,有没有办法使用crtp与多个派生类,以及多态?
class AutoSomething
{
public:
AutoSomething(Object& ob)
: object_(object)
{}
~AutoSomething()
{
object_.some_callback();
}
private:
Object& object_;
};
.........
void Object::some_function()
{
AutoSomething some(*this);
some_function_which_may_throw_exception();
}
Run Code Online (Sandbox Code Playgroud)
问题是 - 当AutoSomething的析构函数被调用时,Object的状态是否正常?
我在几个地方看到,在priority_queue中,pop_heap的复杂性是O(2*log(N)),是真的吗?如果是,那2来自哪里?删除第一个元素后,只需要重建堆,这将需要O(log(N)).
在NUMA架构(非统一内存访问)中,每个处理器都有自己的第一级缓存,因此存在用于处理器通信的协议(MESI).但为什么不能将每个处理器直接连接到其他缓存?我读到"连接速度不够快",但这并没有解释太多.
谢谢.
我想替换文件中的字符串.我当然可以用
perl -pi -e 's/pattern/replacement/g' file
Run Code Online (Sandbox Code Playgroud)
但是我想用脚本来做.
还有其他方法可以做到system("perl -pi -e s/pattern/replacement/g' file")吗?