第1,2,3,4行有什么区别?
我什么时候使用?
为什么第3行打印constructor Foo和第7行返回错误而第8行没有?
#include <iostream>
using namespace std;
class Foo
{
public:
Foo ( )
{
cout << "constructor Foo\n";
}
};
class Bar
{
public:
Bar ( Foo )
{
cout << "constructor Bar\n";
}
};
int main()
{
/* 1 */ Foo* foo1 = new Foo ();
/* 2 */ Foo* foo2 = new Foo;
/* 3 */ Foo foo3;
/* 4 */ Foo foo4 = Foo::Foo();
/* 5 */ Bar* bar1 = new Bar …Run Code Online (Sandbox Code Playgroud) 在C++ 11标准的上下文中(不再有序列点的概念,如您所知),我想了解如何定义两个最简单的示例.
int i = 0;
i = i++; // #0
i = ++i; // #1
Run Code Online (Sandbox Code Playgroud)
SO上有两个主题可以解释C++ 11环境中的这些示例.这里据说#0调用UB并且#1定义明确.这里有人说,这两个例子是不确定的.这种模棱两可让我很困惑.我已经三次读过这个结构良好的参考文献,但这个主题似乎对我来说太复杂了.
.
让我们分析一下这个例子#0:i = i++;.
相应的报价是:
内置后增量和后减量运算符的值计算在其副作用之前进行排序.
内置赋值运算符和所有内置复合赋值运算符的副作用(左参数的修改)在左右参数的值计算(但不是副作用)之后排序,并在之前排序赋值表达式的值计算(即,在返回对修改对象的引用之前)
如果相对于同一标量对象的另一个副作用,标量对象的副作用未被排序,则行为未定义.
当我得到它时,赋值运算符的副作用没有按其左右参数的副作用排序.因此,赋值运算符的副作用没有按副作用排序i++.所以#0调用一个UB.
.
让我们分析一下这个例子#1:i = ++i;.
相应的报价是:
内置preincrement和predecrement运算符的副作用在其值计算之前被排序(由于定义为复合赋值的隐式规则)
内置赋值运算符和所有内置复合赋值运算符的副作用(左参数的修改)在左右参数的值计算(但不是副作用)之后排序,并在之前排序赋值表达式的值计算(即,在返回对修改对象的引用之前)
如果相对于同一标量对象的另一个副作用,标量对象的副作用未被排序,则行为未定义.
我看不出,这个例子是怎样的#0.对于我而言,这似乎是一个UB,原因与此相同#0.分配的副作用没有按照副作用排序++i.它似乎是一个UB.上面讨论的主题说它定义明确.为什么?
.
问题:如何应用引用规则来确定示例的UB.一个尽可能简单的解释将不胜感激.谢谢!
我设计了一个Timer类,每隔nn秒调度一次事件(使用Observer模式).当然它会创建一个新线程,以便不阻止调用它的线程.
然后我想 - 嗯......让我们说100个客户端连接到我的服务器程序,我为每个客户端创建了3个计时器,所以我运行了300个线程.不是很多吗?它是一个ok,我运行300线程?
然后我被告知 AS3 Timer在主线程中运行.我想知道:怎么样?如何实现在主线程中运行的计时器而不是阻塞它?在C++中有可能吗?
在我的项目中(仅限浏览器上下文)我想使用JS代码质量工具.我都试过jslint和eslint.我希望linter帮助我使我的代码干净,清晰,错误并提高其整体质量.我不想做的是我不想写一些肮脏的黑客或使用不好的做法只是为了让傻瓜高兴.
我只关心一个问题.他们都报告了一个问题,我在定义之前使用了一个函数.显然,在下面的代码片段中bar,在定义之前不会调用它.
function foo() {
bar();
}
function bar() {
}
foo();
Run Code Online (Sandbox Code Playgroud)
在这个最简单的场景中,我可以bar先行动foo.但有些情况下,这是不可能的.第一个功能使用第二个,第二个使用第三个,第三个使用第一个.
看起来我可以通过在他们的定义之前声明所有函数来使这些变得快乐.
var foo;
var bar;
foo = function() {
bar();
};
bar = function() {
};
foo();
Run Code Online (Sandbox Code Playgroud)
问题是:
yes我坚持这种做法,不应该吗?no这个问题的良好做法是什么?尝试编译以下代码:
struct Foo
{
explicit Foo ( void ) { }
explicit Foo ( Foo&& rhs ) { }
};
Foo bar ( void )
{
return Foo();
}
Run Code Online (Sandbox Code Playgroud)
收到以下错误:
调用隐式删除的'Foo'复制构造函数
好吧,很明显,拷贝代码被隐式删除了.
问题1:为什么编译器需要copy-ctor Foo?我期望使用move-ctor bar从rvalue构造返回值Foo().
然后我将move-ctor重新声明为隐式,并且所有内容都成功编译.
问题2:当我将move-ctor重新声明为隐式时,为什么编译器不再需要copy-ctor?
问题3:什么是explicit关键词意味着副本的背景和移动构建函数,因为它肯定意味着什么从正规构建函数的背景不同.
我正在尝试向我的类添加一个静态常量变量,这是一个结构的实例.由于它是静态的,我必须在类声明中初始化它.试试这段代码
class Game {
public:
static const struct timespec UPDATE_TIMEOUT = { 10 , 10 };
...
};
Run Code Online (Sandbox Code Playgroud)
得到此错误:
错误:在'{'标记之前,不允许使用括号括起的初始值设定项
错误:非整数类型'const timespec'的静态数据成员的类内初始化无效
我该如何初始化它?谢谢!
struct timespec我班上有一名成员.我该如何初始化它?
我得到的唯一疯狂的想法是派生我自己的timespec并给它一个构造函数.
非常感谢!
#include <iostream>
class Foo
{
private:
const timespec bar;
public:
Foo ( void ) : bar ( 1 , 1 )
{
}
};
int main() {
Foo foo;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译完成时出现错误:source.cpp:在构造函数'Foo :: Foo()'中:source.cpp:9:36:错误:没有用于调用'timespec :: timespec(int,int)'source.cpp的匹配函数:9:36:注意:候选人是:sched.h中包含的文件:34:0,来自pthread.h:25,来自/usr/lib/gcc/i686-pc-linux-gnu/4.7.2/. ./../../../include/c++/4.7.2/i686-pc-linux-gnu/bits/gthr-default.h:41,来自/ usr/lib/gcc/i686-pc-linux -gnu/4.7.2 /../../../../ include/c ++/4.7.2/i686-pc-linux-gnu/bits/gthr.h:150,来自/ usr/lib/gcc /i686-pc-linux-gnu/4.7.2/../../../../include/c++/4.7.2/ext/atomicity.h:34,来自/ usr/lib/gcc/i686 -pc-linux-gnu/4.7.2 /../../../../ include/c ++/4.7.2/bits/ios_base.h:41,来自/ usr/lib/gcc/i686-pc -linux-gnu/4.7.2 /../../../../ include/c ++/4.7.2/ios:43,来自/usr/lib/gcc/i686-pc-linux-gnu/4.7 .2 /../../../../ include/c ++/4.7.2/ostream:40,来自/usr/lib/gcc/i686-pc-linux-gnu/4.7.2/../ ../../../include/c++/4.7.2/iostream:40,来自source.cpp:1:time.h:120:8:注意:timespec :: timespec()time.h:120: 8:注意:候选人 期望0个参数,2提供time.h:120:8:注意:constexpr timespec :: timespec(const timespec&)time.h:120:8:注意:候选者需要1个参数,2个提供time.h:120:8:注意:constexpr timespec :: timespec(timespec &&)time.h:120:8:注意:候选人需要1个参数,2个提供
标准的12.2.5部分说:
在函数调用(5.2.2)中与引用参数的临时绑定将持续存在,直到包含该调用的完整表达式完成为止.函数返回语句(6.6.3)中返回值的临时绑定将一直存在,直到函数退出.在所有这些情况下,在初始化引用的表达式的求值期间创建的临时值,除了引用所绑定的临时值之外,在创建它们的完整表达式的末尾以及与它们相反的顺序被销毁.完成他们的建设.
我试着理解的代码是:
#include <iostream>
const int& foo(const int& fooRef)
{
return fooRef;
} // #0
int main (void)
{
const int& numberRef = foo(5); // #1
std::cout << numberRef; // #2
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在线#1创建临时对象并绑定到fooRef参数foo.fooRef在线销毁#0.所以我认为临时应该在这里销毁,因为生命延长不是传递性的.
问题:
什么until the function exits意思?这是untill it finished executing什么意思?
为什么我得到一个5输出.临时对象是否仍然存在#2?
如何解释标准引用以弄清楚此示例的工作原理?
将非常感谢参考标准的逐步原子演练.谢谢!
PS 这里接受的答案也告诉代码是broken,我没有得到,为什么我得到这样的程序输出.
我设计应该以这种方式工作的观察者模式:观察者调用AddEventListener的方法EventDispatcher,并传递一个字符串,它是的名称event,PointerToItself和PointerToItsMemberMethod
之后event发生在EventDispatcher; 它查看订阅列表,如果有一些,则分配给此事件调用该action方法observer.
我来这里了EventDispatcher.h.小心包含一些伪代码.
这是两个问题:
actionin 的类型struct Subscription?PS:不,我不会使用boost或任何其他库.
#pragma once
#include <vector>
#include <string>
using namespace std;
struct Subscription
{
void* observer;
string event;
/* u_u */ action;
};
class EventDispatcher
{
private:
vector<Subscription> subscriptions;
protected:
void DispatchEvent ( string event );
public:
void AddEventListener ( Observer* observer …Run Code Online (Sandbox Code Playgroud) 假设我们想要创建一个计算两条线交点的函数.交点不总是定义的或唯一的.如何在函数的签名中反映出来?
我想出了这些选择:
bool getIntersectionPoint ( Line& a, Line& b , Point& result );
如果行是并行的,则返回false.否则返回true并将结果写入变量.
Point getIntersectionPoint ( Line& a, Line& b );
如果线条平行,则抛出异常.
[update]
如果我们创建2个函数bool doLinesIntersect(const Line&, const Line&);,Point twoLinesIntersection(const Line&, const Line&);第二个函数仍然可以在第一个函数返回false后调用.