我花了大量的时间来摆弄Visual Studio中的complilation错误.我已经将代码提炼到下面的小编译示例中,并在IdeOne上尝试了它并得到了同样的错误,你可以在这里看到.
我想知道为什么以下代码尝试调用B(const B&)而不是B(B&&):
#include <iostream>
using namespace std;
class A {
public:
A() : data(53) { }
A(A&& dying) : data(dying.data) { dying.data = 0; }
int data;
private:
// not implemented, this is a noncopyable class
A(const A&);
A& operator=(const A&);
};
class B : public A { };
int main() {
B binst;
char* buf = new char[sizeof(B)];
B* bptr = new (buf) B(std::move(binst));
cout << bptr->data << endl;
delete[] buf; …Run Code Online (Sandbox Code Playgroud) 我有一个页面,它在Javascript中执行一些强烈而持久的计算.我想有一个加载动画来告诉用户正在取得进展.我现在有一个GIF动画,但是当Javascript运行时,整个浏览器窗口会冻结(并且gif不会播放).然后当它完成时,它会解冻.计算必须是客户端,因此无法在服务器上完成.
有没有办法让Javascript冻结页面并在进行计算时停止播放动画?
为什么openstd ::(i | o)fstream类的构造函数和方法将文件的名称作为参数以a的形式const char*而不是std::string?似乎STL的创建者想要使用他们所写的内容而不是使用他们编写的类来替换它.
我有一个div,float: right它在父div中.p同一个父div中也有元素,文本float: right正确地包围div.但是,如果我将p元素设置为具有边框,或者执行a <hr />,则边框不会停止文本停止的位置,而是延伸到float: rightdiv 后面.
这是一个美丽的mspaint描述的情况:

请注意,黑色水平线的绿色部分位于浮动div的后面.
我如何获得边界或<hr />其他任何东西只能与文本一样宽,而不是在div后面?
我有一个可变参数模板函数,它调用自己来确定列表中的最大数字(由模板化参数构成).我试图在参数包为空时进行专门化,这样我就可以返回列表前面的数字,但我不知道该怎么做.我只是熟悉可变参数模板和模板专业化,但这是我到目前为止所拥有的:
#include <string>
#include <iostream>
using namespace std;
template <int N, int... N2>
int tmax() {
return N > tmax<N2...>() ? N : tmax<N2...>();
}
template <int N>
int tmax() {
return N;
}
int main() {
cout << tmax<32, 43, 54, 12, 23, 34>();
}
Run Code Online (Sandbox Code Playgroud)
但是,这会产生以下错误:
test.cpp: In function ‘int tmax() [with int N = 34, int ...N2 = {}]’:
test.cpp:9:45: instantiated from ‘int tmax() [with int N = 23, int ...N2 = {34}]’
test.cpp:9:45: instantiated from ‘int tmax() …Run Code Online (Sandbox Code Playgroud) c++ templates template-specialization variadic-templates c++11
C++标准库是否具有"有序集"数据结构?通过有序集合,我的意思是与普通的完全相同,std::set但是它会记住您将项目添加到其中的顺序.
如果没有,模拟一个的最佳方法是什么?我知道你可以做一些事情就像有一对配对,每一对都存储它被添加的数字和实际值,但如果有一个更简单的解决方案,我不想跳过箍.
我正在开发一个只包含头文件的库.到目前为止,它只包含类,这很好.但是,我已经到了这样的程度,我需要在库中有一些库中可访问的不可变数据(即,不是类实例数据)来实现某些功能.你显然不能只将全局数据放在头文件中,否则每个标题的编译单元#include都会有一个符号定义,你会在链接时得到多个定义错误.
我似乎找到了一个解决方法,让我可以在类中拥有静态数据,而无需通过将数据static作为函数中的变量并返回指向该数据的指针来向库中添加编译单元:
class StaticData {
public:
void doSomething() { /* this uses getData */ }
void doSomethingElse() { /* this does too */ }
private:
static int* getData() {
static int array[] { 1, 2, 3, 4 };
return array;
}
};
Run Code Online (Sandbox Code Playgroud)
这似乎工作正常,但我必须承认我不知道头文件static中的inline函数中的函数数据会发生什么.我想知道这个"黑客"是否有任何意想不到的影响,比如#include这个标题的每个编译单元都有自己的版本array.编译器如何以及在何处决定使用它?
还应该注意的是,我没有使用它来实现单例反模式或任何东西.我只是用它来存储多个函数需要使用的数据(这就是为什么它不能static只是一个使用它的函数,但即使它确实如此,也会提示相同的问题).
为什么一个类decltype在继承列表中不能有?例如,我希望以下代码可以A<B>继承RType,但是使用G ++ 4.6.1(使用-std=c++0x)它不能编译:
#include <type_traits>
template<typename T>
class A : public decltype(std::declval<T>().hello()) { };
class RType { };
class B {
public:
RType hello() { return RType(); }
};
int main() {
A<B> a;
}
Run Code Online (Sandbox Code Playgroud)
它给出了以下输出:
test.cpp:6:18: error: expected class-name before 'decltype'
test.cpp:6:18: error: expected '{' before 'decltype'
test.cpp:6:54: error: expected unqualified-id before '{' token
test.cpp: In function 'int main()':
test.cpp:16:7: error: aggregate 'A<B> a' has incomplete type and cannot be defined …Run Code Online (Sandbox Code Playgroud) 下面的示例代码在Visual C++中编译得很好:
class Test {
private:
struct {
struct {
int privateData;
};
};
};
int main(int, char **)
{
Test test;
test.privateData = 0;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但为什么?我期望编译器错误,因为privateData函数main应该无法访问该成员,因为它应该private像它的容器容器一样.我知道无名结构不是官方C++的一部分,但这个设计是asinine.
顺便说一句,我也试图改变private成protected和struct成union:它看起来像编译器拒绝兑付匿名结构和联合嵌套在另一个匿名结构或联合内部的访问修饰符.
有人可以解释这个功能吗?
我有一个关于如何实现闭包的问题.
假设这是在一个名为的文件中test.lua:
local a = 'asdf'
local function b()
return a
end
a = 10
return b
Run Code Online (Sandbox Code Playgroud)
而另一个文件呢
a = require 'test'
a()
Run Code Online (Sandbox Code Playgroud)
它会打印出来
10
Run Code Online (Sandbox Code Playgroud)
如果a是堆栈上的指针'asdf'(在堆上我假设,但没关系),并且b创建了闭包,因此大概a是保存的地址供b使用,如何a = 10将闭包内的指针更改为好?
维基百科很好地说了令我困惑的事情:
如果语言实现的运行时内存模型在线性堆栈1上分配所有局部变量,则它无法轻松支持完全闭包.在这些语言中,函数返回时会释放函数的局部变量.
我在想,或许b真的没有保存指针'asdf'但是堆栈偏移量a,这样你就可以改变a,堆栈偏移量会让你到达a你设置的最后一个点a,但是那时它是如何工作的a(从堆栈中弹出指针)堆栈偏移变为无效?
1我知道Lua不会在堆栈上分配值,但它会将堆栈上的本地指针分配给堆中的值,不是吗?