小编use*_*289的帖子

在哪个位置发生模板实例化绑定?

此代码来自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)

我的问题是:

  1. 为什么第一个代码有效?g()稍后声明,我真的得到了G ++ 4.9.2的错误,那时g没有声明.

  2. extern g(double) - 这是如何工作的?因为在函数重载的情况下返回值无关紧要,那么我们可以在前向声明中错过它吗?

  3. f()的实例化点就在h()之前 - 为什么?在f(2)被调用时它会被实例化是不合逻辑的?就在我们称之为的地方,它g(double)已经在范围内了.

  4. "实例化点"的定义意味着模板参数永远不能绑定到本地名称或类成员 - 在C++ 14中是否已更改?我在使用C++(G ++ 4.9.2)时遇到错误,但是在C++ 14(G ++ 4.9.2)中没有出错.

c++ templates name-binding c++14 template-instantiation

21
推荐指数
1
解决办法
589
查看次数

当我只想禁用它时,自定义赋值运算符=()的签名是否重要?

我需要禁用复制赋值运算符.这将有效:

A& operator=(const A&);
Run Code Online (Sandbox Code Playgroud)

如果我没有指定确切的参数,它会工作operator=吗?
我的意思是这样的:

void operator=(void);
Run Code Online (Sandbox Code Playgroud)

返回值是正确的,我可以写任何我想要的,但参数类型怎么样?
这会覆盖operator=类的默认值吗?

c++ operator-overloading assignment-operator

11
推荐指数
3
解决办法
1443
查看次数

驱动程序和用户应用程序之间的主要区别是什么?

我知道用户应用程序只能在用户模式下运行,这是为了系统安全。相反,大多数驱动程序在内核模式下运行,以访问 I/O 设备。尽管如此,一些驱动程序在用户模式下运行,但允许访问 I/O 设备。所以我有以下问题。驱动程序和用户应用程序之间的主要区别是什么?不能像某些驱动程序那样允许用户应用程序访问 I/O 设备吗?

谢谢。

io operating-system kernel driver usermode

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

C++ try-catch块没有捕获硬件异常

我正在检查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)

它只捕获除零异常.这是处理器的依赖还是还有别的?还有一个小问题,调试和发布版本之间有什么区别吗?

windows operating-system exception seh visual-studio

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

为什么派生类的析构函数被调用?

我有一个简单的程序:

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)

为什么派生类的析构函数被称为?它是虚拟的,但是我们按名称调用析构函数,或者是否存在析构函数的隐藏名称,对于所有类都是相同的?

c++ polymorphism inheritance destructor virtual-functions

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

我可以将CRTP与多个派生类一起使用,并以多态方式使用它们吗?

我有这样的类层次结构:

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与多个派生类,以及多态?

c++ inheritance templates virtual-functions crtp

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

堆栈展开时使用RAII是否安全?

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的状态是否正常?

c++ destructor exception raii stack-unwinding

3
推荐指数
1
解决办法
131
查看次数

为什么pop_heap的复杂性是O(2*log(N))?

我在几个地方看到,在priority_queue中,pop_heap的复杂性是O(2*log(N)),是真的吗?如果是,那2来自哪里?删除第一个元素后,只需要重建堆,这将需要O(log(N)).

heap stl priority-queue asymptotic-complexity

3
推荐指数
1
解决办法
398
查看次数

为什么不能从一个处理器直接访问另一个处理器的缓存?

在NUMA架构(非统一内存访问)中,每个处理器都有自己的第一级缓存,因此存在用于处理器通信的协议(MESI).但为什么不能将每个处理器直接连接到其他缓存?我读到"连接速度不够快",但这并没有解释太多.

谢谢.

caching processor multiprocessing numa mesi

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

如何用脚本中的Perl替换文件中的字符串(不在命令行中)

我想替换文件中的字符串.我当然可以用

 perl -pi -e 's/pattern/replacement/g' file
Run Code Online (Sandbox Code Playgroud)

但是我想用脚本来做.

还有其他方法可以做到system("perl -pi -e s/pattern/replacement/g' file")吗?

regex shell scripting perl

0
推荐指数
1
解决办法
3445
查看次数