C++ 11允许inline namespace
s,其所有成员也自动在封闭中namespace
.我想不出任何有用的应用 - 有人可以给出一个简短,简洁的例子,说明inline namespace
需要哪种情况以及最常用的解决方案?
(另外,当发生了什么并不清楚,我namespace
声明inline
在一个但不是所有的声明,这可能住在不同的文件.这难道不是找麻烦?)
假设我正在启动a std::thread
然后detach()
它,所以线程继续执行,即使std::thread
它曾经表示它,超出范围.
进一步假设该程序不具有用于接合分离的线程一个可靠的协议1,所以分离线程仍然运行时main()
退出.
我在标准中找不到任何东西(更准确地说,在N3797 C++ 14草案中),它描述了应该发生的事情,1.10和30.3都没有包含相关的措辞.
1另一个可能是等同的问题是:"可以再次连接一个分离的线程",因为你要发明加入的协议,信号部分必须在线程仍在运行时完成,并且OS调度程序可能决定在执行信令之后让线程休眠一小时,接收端无法可靠地检测到线程实际完成.
如果用完main()
了卸下运行的线程是不确定的行为,那么任何使用的std::thread::detach()
是除非主线程永远不会退出未定义行为2.
因此,运行main()
脱离线程的耗尽必须具有已定义的效果.问题是:其中(在C++标准,不POSIX,不OS文档,......)都处于所定义的那些的效果.
2分离的线程不能加入(在感std::thread::join()
).您可以等待分离线程的结果(例如,通过未来std::packaged_task
,或通过计数信号量或标志和条件变量),但这并不能保证线程已完成执行.事实上,除非你把信令部分进入线程的第一个自动对象的析构函数,也将在一般情况下,是运行的代码(析构函数)后的信号代码.如果操作系统安排主线程使用结果并在分离的线程完成运行所述析构函数之前退出,^ Wis定义会发生什么?
我收到此错误:
无法将MySQL日期/时间值转换为System.DateTime
而我正在尝试从MySQL数据库中获取数据.我的MySQL数据库中有date数据类型.但是在将其检索到我的数据表中时,它会得到上面的错误.
我怎样才能解决这个问题?
有人能用一种凡人理解的语言解释它吗?
Boost.Signals允许使用槽的返回值的各种策略来形成信号的返回值.例如,添加它们,形成vector
它们,或返回最后一个.
常见的智慧(在Qt文档中表达[编辑:以及该问题的一些答案])是Qt信号不可能有这样的事情.
但是,当我在以下类定义上运行moc时:
class Object : public QObject {
Q_OBJECT
public:
explicit Object( QObject * parent=0 )
: QObject( parent ) {}
public Q_SLOTS:
void voidSlot();
int intSlot();
Q_SIGNALS:
void voidSignal();
int intSignal();
};
Run Code Online (Sandbox Code Playgroud)
不仅没有moc抱怨具有非void返回类型的信号,它似乎以允许返回值传递的方式主动实现它:
// SIGNAL 1
int Object::intSignal()
{
int _t0;
void *_a[] = { const_cast<void*>(reinterpret_cast<const void*>(&_t0)) };
QMetaObject::activate(this, &staticMetaObject, 1, _a);
return _t0;
}
Run Code Online (Sandbox Code Playgroud)
所以:根据文档,这件事是不可能的.那么moc在这做什么?
插槽可以有返回值,那么我们可以将带有返回值的插槽连接到具有返回值的信号吗?毕竟,这可能吗?如果是这样,它有用吗?
编辑:我不是要求解决方法,所以请不要提供任何解决方法.
编辑:它显然在Qt::QueuedConnection
模式中没用(QPrintPreviewWidget …
在Java中,访问说明符和访问修饰符是一样的吗?
我有以下错误的代码,我试图在VC2010中编译,但我得到错误C2974这只发生在我包含lambda表达式时,所以我猜它与此有关.
typedef pair<pair<int, int>, int> adjlist_edge;
priority_queue< adjlist_edge , vector<adjlist_edge>,
[](adjlist_edge a, adjlist_edge b) -> bool {
if(a.second > b.second){ return true; } else { return false; }
}> adjlist_pq;
Run Code Online (Sandbox Code Playgroud)
我知道模板定义的形式是正确的
priority_queue<int , vector<int>, greater<int>> pq;
Run Code Online (Sandbox Code Playgroud)
按预期工作.我有什么想法我做错了吗?看起来不对的lambda有什么明显的错误我可能会忽略吗?谢谢阅读!
在/sf/answers/137702841/中,提供了一种解决方案,用于静态检查成员是否存在,可能在类型的子类中:
template <typename Type>
class has_resize_method
{
class yes { char m;};
class no { yes m[2];};
struct BaseMixin
{
void resize(int){}
};
struct Base : public Type, public BaseMixin {};
template <typename T, T t> class Helper{};
template <typename U>
static no deduce(U*, Helper<void (BaseMixin::*)(), &U::foo>* = 0);
static yes deduce(...);
public:
static const bool result = sizeof(yes) == sizeof(deduce((Base*)(0)));
};
Run Code Online (Sandbox Code Playgroud)
但是,它不适用于C++ 11 final
类,因为它继承了被测试的类,这会final
阻止它.
OTOH,这一个:
template <typename C>
struct has_reserve_method {
private:
struct No …
Run Code Online (Sandbox Code Playgroud) 在Visual Studio中,__declspec(property)
创建了与C#类似的属性.Borland C++提供的__property
关键字具有完全相同的功能.在C++ 0x中,提到了一个implicit
可以扩展以实现相同功能的关键字.但它没有进入规范.
我正在寻找一种可移植且相对干净的方法来声明语法上含糖的属性,这些属性将在最新的Windows,OSX和Linux编译器中编译.我不关心编译器兼容性,每个平台只有一个编译器.
我不是在寻找需要括号来获取或设置属性的属性的替代方法,例如分隔getter和setter的重载方法.
这是在Visual Studio 2010中编译的理想用法:
#define _property(_type, _name, _get, _put) __declspec(property(get=_get, put=_put)) _type _name
#define _property_readonly(_type, _name, _get) __declspec(property(get=_get)) _type _name
class Window
{
public:
_property_readonly(void*, Handle, GetHandle);
_property(bool, Visible, GetVisible, SetVisible);
void* GetHandle();
bool GetVisible();
void SetVisible(bool);
}
void main()
{
Window MainWindow;
if (!MainWindow.Visible)
MainWindow.Visible = true;
}
Run Code Online (Sandbox Code Playgroud) c++ ×8
c++11 ×6
.net ×1
asp.net ×1
asp.net-3.5 ×1
class ×1
exit ×1
final ×1
gcc ×1
java ×1
lambda ×1
memory-model ×1
mysql ×1
namespaces ×1
predicate ×1
properties ×1
qt ×1
return-value ×1
stdthread ×1
stl ×1
structure ×1
type-traits ×1
visual-c++ ×1