如果我有一个用户定义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.
我搜索了一下这方面的信息,但没有找到任何令人满意的.函数调用是否有一些特殊的行为
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)
这正是我期望看到的.那么,为什么警告?
我无法理解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)),为什么?
我正在尝试实现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) 在这个答案中,出现了以下情况:
#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)
它无法编译,声明"源类型不是多态的".我觉得这是一个线索,但它仍然似乎是一个延伸,找到属于当前指针是基础的类的非多态基类(这个句子是否有意义?).
所以,假设我有一个这样的标题:
#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++中可以拥有的最大大小.
#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?
我实际上并不需要这个,这个问题是出于好奇的缘故.
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>.可以假设这是照顾的.
我试图理解右值引用和移动语义.在下面的代码中,当我将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)
谢谢.
考虑代码
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)