小编GRB*_*GRB的帖子

我对值初始化的尝试被解释为函数声明,为什么不是A a(()); 解决这个问题?

Stack Overflow教给我的很多东西都是所谓的"最令人烦恼的解析",经典地用一条线来证明

A a(B()); //declares a function
Run Code Online (Sandbox Code Playgroud)

虽然这对于大多数人而言,直观地看起来是a类型对象的声明A,将临时B对象作为构造函数参数,它实际上是一个函数a返回的声明A,将一个指针指向一个返回的函数,它B本身不带参数.同样的线

A a(); //declares a function
Run Code Online (Sandbox Code Playgroud)

也属于同一类别,因为它代替一个对象,它声明了一个函数.现在,在第一种情况下,这个问题的通常解决方法是在其周围添加一组额外的括号/括号B(),因为编译器会将其解释为对象的声明

A a((B())); //declares an object
Run Code Online (Sandbox Code Playgroud)

但是,在第二种情况下,执行相同操作会导致编译错误

A a(()); //compile error
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么?是的我非常清楚正确的"解决方法"是将其更改为A a;,但我很想知道()第一个示例中的额外功能是什么,然后在重新应用它时不起作用第二个例子.A a((B()));变通办法是否是写入标准的特定异常?

c++

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

转换构造函数与转换运算符:优先级

在这里阅读关于转换运算符和构造函数的一些问题让我思考它们之间的相互作用,即当存在"模糊"调用时.请考虑以下代码:

class A;

class B { 
      public: 
         B(){} 

         B(const A&) //conversion constructor
         { 
              cout << "called B's conversion constructor" << endl; 
         } 
};

class A { 
      public: 
         operator B() //conversion operator
         { 
              cout << "called A's conversion operator" << endl; 
              return B(); 
         } 
};

int main()
{
    B b = A(); //what should be called here? apparently, A::operator B()
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码显示"被称为A的转换运算符",这意味着调用转换运算符而不是构造函数.如果operator B()从中删除/注释掉代码A,编译器将很乐意切换到使用构造函数(不对代码进行其他更改).

我的问题是:

  1. 由于编译器不认为B b = A();是一个模糊的调用,因此这里必须有某种类型的优先级.这个优先权究竟在哪里确定?(将赞赏C++标准的参考/引用)
  2. 从面向对象的哲学角度来看,这是代码应该表现的方式吗?谁更了解A对象应该如何成为一个B对象, …

c++ constructor operators type-conversion conversion-operator

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

分析Windows中的崩溃:错误消息告诉我们什么?

我个人使用的一个小实用程序(用C++编写)昨天随机崩溃(我已经使用它大约100多个小时,到目前为止没有问题)虽然我通常不这样做,但我感觉有点喜欢冒险,想尝试更多地了解这个问题.我决定进入事件查看器,看看Windows记录的崩溃事件:

Faulting application StraightToM.exe, version 0.0.0.0, time stamp 0x4a873d19 
Faulting module name : StraightToM.exe, version 0.0.0.0, time stamp 0x4a873d19
Exception code : 0xc0000005
Fault offset : 0x0002d160,
Faulting process id: 0x17b4
Faulting application start time: time 0x01ca238d9e6b48b9.
Run Code Online (Sandbox Code Playgroud)

我的问题是,这些东西意味着什么,我将如何使用它们来调试我的程序?这是我目前所知的:异常代码描述了错误,而0xc0000005是内存访问冲突(试图访问它不拥有的内存).我特别想知道更多有关以下内容的信息:

  1. 故障偏移是什么意思?这是表示文件中发生错误的位置,还是表示发生错误的程序集"line"?知道了故障偏移,我如何使用像OllyDbg这样的程序来查找导致错误的相应汇编代码?或者 - 甚至更好 - 是否可以(轻松)确定C++源代码中的哪一行代码导致此错误?
  2. 很明显,时间戳对应于崩溃时的32位UNIX时间,但64位应用程序的启动时间意味着什么?如果时间戳为32,为什么它是64位?

请注意,我主要是一名C++程序员,所以虽然我对汇编有所了解,但我对它的了解非常有限.此外,这确实不是一个需要修复的严重问题(并且鉴于程序的性质也不容易复制),我只是以此为借口来了解这些错误消息的含义.我在网上找到的关于这些崩溃日志的大部分信息通常都是针对最终用户的,所以他们并没有帮助我(作为程序员).

提前致谢

c++ windows crash debugging assembly

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

用于在任意位置从一个int复制N位到另一个int的算法

我过去几天一直在思考的一个有趣的问题是如何将一个整数的位复制到目标整数中给定位置的另一个整数.因此,例如,给定目标整数0xdeadbeef和源整数0xabcd,想法是获得0xabcdbeef(给定目标位置为16位)或0xdeabcdef(给定8位的目标位置)的结果.

由于避免条件或循环的任意限制(允许自己只使用数学/按位运算),我开发了以下函数(C++)

int setbits(int destination, int source, int at, int numbits)
{
    int ones = ((1<<(numbits))-1)<<at;
    return (ones|destination)^((~source<<at)&ones);
}
Run Code Online (Sandbox Code Playgroud)

其中at是其中源位应该被复制到目的地号码(0-31)和地方numbits是被复制的比特数source(1-32).据我所知,这个算法适用于除at= 0和numbits= 32 之外的所有值(整个目标整数被源整数覆盖的情况),因为1 << 32导致1(从转移包裹)而不是0.

我的问题是:

  1. 这通常是怎么做的?是否有任何特别值得注意的算法使用(值得注意的是,我问是否有任何特别有效的技巧可以用来做到这一点)?
  2. 我的算法是否能像我认为的那样工作(也就是说,除了= 0和numbits = 32之外,它适用于所有值)?
  3. 与1)相关,有没有办法只使用数学/位运算符?所有值的算法使用条件或循环是微不足道的,所以我对此不感兴趣.

算法设计对我来说通常是一个弱点,所以当我只使用数学/按位运算时,我不知道我的算法是否"尽可能好".谢谢

c++ algorithm bit-manipulation

14
推荐指数
2
解决办法
6364
查看次数

有什么方法可以加快这个VBA算法的速度吗?

我期待实现VBA 特里路技术算法,该算法能够处理的时间(小于15-20秒)相对较短量大幅英语词汇(〜50,000字).由于我是一名C++程序员(这是我第一次做任何实质性的VBA工作),我构建了一个快速概念验证程序,能够在大约半秒钟内完成计算机上的任务.然而,当测试VBA端口的时候,它花了差不多两分钟来做同样的事情 - 为了我的目的,这是一个不可接受的长时间.VBA代码如下:

节点类模块:

Public letter As String
Public next_nodes As New Collection
Public is_word As Boolean
Run Code Online (Sandbox Code Playgroud)

主要模块:

Dim tree As Node

Sub build_trie()
    Set tree = New Node
    Dim file, a, b, c As Integer
    Dim current As Node
    Dim wordlist As Collection
    Set wordlist = New Collection
    file = FreeFile
    Open "C:\corncob_caps.txt" For Input As file
    Do While Not EOF(file)
        Dim line As String
        Line Input #file, line
        wordlist.add line
    Loop
    For a = 1 To …
Run Code Online (Sandbox Code Playgroud)

excel vba excel-vba trie

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

将指针转换为模板参数:Comeau&MSVC编译,GCC失败

请考虑以下代码:

template<int* a>
class base {};

int main()
{
    base<(int*)0> test;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Comeau和MSVC都没有问题编译(除了关于未使用的变量的Comeau警告),而GCC base<(int*)0> test;在线路上失败,说明

在函数`int main()'中:强制转换为除积分或枚举类型以外的类型不能出现在常量表达式中

模板参数1无效

究竟是什么抱怨的?谁是对的 - 这段代码应该编译吗?值得注意的是,我的GCC版本非常陈旧(3.4.2),因此可能与它有关.谢谢.

c++ compiler-construction gcc templates

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

C++ 0x的lambda表达式没有命名类型是不是很糟糕?

我最近在互联网上阅读了一些关于lambda表达式的内容,在我看来,C++ 0x的lambda表达式不会有一个只能绑定到lambda表达式的单一类型(或类型) - 换句话说,lambda表达式只匹配模板参数或auto参数/变量.会发生什么,如所描述这里,是

支持lambda的编译器将为每个lambda表达式创建一个唯一的匿名函子类型

我的问题是,这是件坏事吗?让一些只与lambda表达式匹配的关键字是不合理的,例如lambda,它可以如下工作

void f(std::function<int(int)> func)
{
     func(2);
}

template<typename T>
void g(T func)
{
     func(2);
}

void h(lambda func)
{
     func(2);
}

int main()
{
    int fpointer(int);
    struct { int operator()(int var) { return var; } } functor;

    f(fpointer); //ok (actually a linker error, but for the sake of example)
    f(functor); //ok
    f([](int var) { return var; }); //ok

    g(fpointer); //ok
    g(functor); //ok
    g([](int var) { return var; }); //ok …
Run Code Online (Sandbox Code Playgroud)

c++ lambda c++11

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