小编Sir*_*Guy的帖子

当有额外的括号时,在临时对象上调用用户定义的operator +时出错

如果我有一个用户定义operator+()的:

    class A
    {
    public:
        A operator+(A)
        {
            return A();
        }
    };
Run Code Online (Sandbox Code Playgroud)

然后以下按预期工作:

    A a = A() + A();
Run Code Online (Sandbox Code Playgroud)

但g ++ - 4.7给出了以下错误消息:

    A a = (A()) + A();
Run Code Online (Sandbox Code Playgroud)

特别是错误消息是error: no match for ‘operator+’ in ‘+A()’.
看起来(A())在表达式中被忽略了.

我的问题是:A a = (A()) + A();应该编译,如果没有,为什么不呢?

注意:当我这样#define X (Identity())做时,这发生在我身上然后尝试了X + X.

c++ operator-overloading most-vexing-parse

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

为什么gcc -Wall会给出关于零长度格式字符串的警告?

我搜索了一下这方面的信息,但没有找到任何令人满意的.函数调用是否有一些特殊的行为

sprintf(someString, "");
Run Code Online (Sandbox Code Playgroud)

这解释了为什么这是警告(在gcc上使用-Wall)?我只是发现C标准允许零长度格式字符串.

我尝试了以下示例

#include <stdio.h>

int main()
{
    char str[2] = {'a', 'a'};
    sprintf(str, "");
    printf("\'%c\'\'%c\'\n", str[0], str[1]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

打印出来的

'''a'
Run Code Online (Sandbox Code Playgroud)

这正是我期望看到的.那么,为什么警告?

c printf gcc string-formatting gcc-warning

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

GCC如何处理内置函数

我无法理解GCC内置函数,感到非常困惑.

  • 库函数和内置函数有什么区别?

  • 是否有内置函数可以做但库函数不能做?

  • 我可以编写一个库函数来执行与内置函数printf相同的任务吗?如何判断输入参数的类型(%f,float还是double)?

  • GCC内置函数的机器指令不存储在库中,对吧?他们在哪?

  • 在进行链接时,如何控制这些内置功能代码的放置位置?

  • 为什么有时我会在进行链接时出现错误消息,例如"未定义引用__builtin_stdarg_start"

    // main.c
    #include <stdio.h>
    int main(void) {
      printf("hello world!\n");
      return 0;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    gcc -c main.c,nm表明main.o中没有符号printf,(只有main(T)和puts(U)),为什么?

c c++ gcc

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

在C++中实现不相交集(Union Find)

我正在尝试实现Disjoint Sets以用于Kruskal的算法,但我无法准确理解它应该如何完成,特别是如何管理树林.在阅读了维基百科关于不相交集的描述之后,在阅读了算法导论(Cormen等人)中的描述后,我得出以下结论:

    class DisjointSet
    {
    public:
        class   Node 
        {
        public:
            int         data;
            int         rank;

            Node*       parent;

            Node() : data(0), 
                     rank(0),
                     parent(this) { } // the constructor does MakeSet
        };

        Node*   find(Node*);
        Node*   merge(Node*, Node*); // Union
    };


    DisjointSet::Node*   DisjointSet::find(DisjointSet::Node* n)
    {
        if (n != n->parent) {
            n->parent = find(n->parent);
        }
        return n->parent;
    }

    DisjointSet::Node* DisjointSet::merge(DisjointSet::Node* x,
                                          DisjointSet::Node* y)
    {
        x = find(x);
        y = find(y);

        if (x->rank > y->rank) {
            y->parent = x;
        } else {
            x->parent = y;
            if …
Run Code Online (Sandbox Code Playgroud)

c++ disjoint-sets

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

你可以合法地dynamic_cast到多态类的非多态基类

这个答案中,出现了以下情况:

#include <cassert>

struct A {};

struct B { virtual ~B(){} };

struct AA{};
template <class T>
struct C : A, T {};

int main()
{
  B * b = new C<B>;
  AA * aa = new C<AA>;
  assert(dynamic_cast<A*>(b));
  assert(dynamic_cast<A*>(aa)); //this line doesn't compile, as expected
}
Run Code Online (Sandbox Code Playgroud)

在g ++ 4.8.4(Ubuntu)上,这个编译并且断言传递.我的问题是,这真的合法吗?我觉得你根本不应该dynamic_cast参加一个非多态的课程,但我承认我不是这里发生的事情的专家.

当我尝试相反的方向时:

dynamic_cast<B*>((A*)(new C<B>));
Run Code Online (Sandbox Code Playgroud)

它无法编译,声明"源类型不是多态的".我觉得这是一个线索,但它仍然似乎是一个延伸,找到属于当前指针是基础的类的非多态基类(这个句子是否有意义?).

c++ polymorphism casting

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

为什么我不应该在头文件中初始化静态变量?

所以,假设我有一个这样的标题:

#ifndef BASECLASS_H
#define BASECLASS_H

class BaseClass
{
    public:
        static int getX(){return x;}
    private:
        static int x;
};

int BaseClass::x = 10;

#endif
Run Code Online (Sandbox Code Playgroud)

我多次听说过我不应该在头文件中初始化静态变量,而是在cpp中.但是因为有守卫,所以应该只有一个BaseClass :: x副本.所以我有点不明白为什么要放

int BaseClass::x = 10; 
Run Code Online (Sandbox Code Playgroud)

在cpp.谢谢.

c++

9
推荐指数
2
解决办法
2313
查看次数

以编程方式在C++中查找最大静态数组大小

我很好奇是否可以确定数组在C++中可以拥有的最大大小.

    #include <iostream>

    using namespace std;

    #define MAX 2000000

    int main()
    {
      long array[MAX];
      cout << "Message" << endl;
      return 0;
    }
Run Code Online (Sandbox Code Playgroud)

这个编译得很好,但是一旦我运行它就会出现段错误(即使实际上没有引用数组).我知道这也是数组大小,因为如果我将其更改为1000000它运行得很好.

那么,是否存在某种定义或某种方式#define MAX MAX_ALLOWED_ARRAY_SIZE_FOR_MY_MACHINE_DEFINED_SOMEWHERE_FOR_ME

我实际上并不需要这个,这个问题是出于好奇的缘故.

c++ memory

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

将float*强制转换为std :: complex <float>*是否合法?

N3797 26.4 [complex.numbers]说这是关于铸造std::complex<T>*T*

4此外,如果a是类型的表达式,cv std::complex<T>*并且表达式a[i]是为整数表达式定义的i,那么:
- reinterpret_cast<cv T*>(a)[2*i]应指定的实部a[i],并且
- reinterpret_cast<cv T*>(a)[2*i + 1]应指定虚部a[i].

这个(或标准的其他措辞)是否意味着我可以reinterpret_cast反过来?我可以这样做:

    float * pf;
    std::complex<float>* pc = reinterpret_cast<std::complex<float>*>(pf);
    pc[i].real();
Run Code Online (Sandbox Code Playgroud)

正如nm指出的那样,我必须确保对齐pf适合a std::complex<float>.可以假设这是照顾的.

c++ language-lawyer c++11

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

当我们使用右值引用时,究竟会发生什么?std :: move如何工作?

我试图理解右值引用和移动语义.在下面的代码中,当我将10传递给Print函数时,它会调用rvalue reference overload,这是预期的.但究竟发生了什么,10将被复制(或从它引用的地方).其次,std::move究竟做了什么?它是从中提取值10 i然后通过它吗?或者是编译器使用右值参考的指令?

void Print(int& i)
{
    cout<<"L Value reference "<<endl;
}

void Print(int&& i)
{
    cout<<"R Value reference "<< endl;
}

int main()
{
    int i = 10;

    Print(i); //OK, understandable
    Print(10); //will 10 is not getting copied? So where it will stored

    Print(std::move(i)); //what does move exactly do

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

c++ rvalue-reference move-semantics c++11

6
推荐指数
2
解决办法
1570
查看次数

传递const数组时区分特殊化的C++错误

考虑代码

     template <class A>
     class B;

     template <class A>
     class B<const A>{};

     template <class A, int N>
     class B<A[N]>{};

     template <class A>
     class B<A*>{};

     template <class A>
     class B<A&>{};
Run Code Online (Sandbox Code Playgroud)

以下模板实例化工作正常:

     A<int*&>
     A<const int*>
     A<int*[3]>
Run Code Online (Sandbox Code Playgroud)

但以下一个不起作用:

     A<const int[3]>
Run Code Online (Sandbox Code Playgroud)

是否有某些原因导致此特定组合无效或者它可能是g ++ 4.6.3的错误?

顺便说一句,我设法使用SFINAE和boost :: disable_if <>来解决这个问题,所以至少问题已经解决了.

编辑

我忘了提到有问题的错误是一个模糊的类模板实例化,它无法决定const的重载或数组的重载.

EDIT2

这与指针无关,这里是完整的上下文:

我正在阅读C++ Template Metaprogramming一书,我正在做问题2-3(第2章问题3),其中说:

使用类型特征工具来实现一个type_descriptor类模板,其实例在流式传输时打印其模板参数的类型:注意:根据18.5.1 [lib.type.info],我们不能使用RTTI达到相同的效果标准的第7段,typeid(T).name()不保证返回有意义的结果.

我的解决方案(包括编译错误的解决方法)如下:

    //QUESTION 2-3
    template <class T, class enable = void>
    struct type_descriptor
    {
      std::string operator()() const
      {
        return "Unknown";
      }
    };

    //specializations for primitive types …
Run Code Online (Sandbox Code Playgroud)

c++ template-specialization

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