我喜欢在c ++中使用哨兵类,但我似乎有一种精神上的痛苦,导致反复编写如下错误:
{
MySentryClass(arg);
// ... other code
}
Run Code Online (Sandbox Code Playgroud)
毋庸置疑,这是失败的,因为哨兵在创作后立即死亡,而不是在预期的范围结束时死亡.有没有办法防止MySentryClass被实例化为临时代码,以便上面的代码无法编译,或者至少在运行时中止错误消息?
可能重复:
C++:临时参数的生命周期?
据说临时变量作为评估完整表达式的最后一步被破坏,例如
bar( foo().c_str() );
Run Code Online (Sandbox Code Playgroud)
临时指针一直存在,直到bar返回,但是为什么
baz( bar( foo().c_str() ) );
Run Code Online (Sandbox Code Playgroud)
是否它仍然存在直到bar返回,或者baz返回意味着完全表达结束在这里,编译器我检查了baz返回后的destruct对象,但我可以依赖它吗?
下面的代码说明了我的担忧:
#include <iostream>
struct O
{
~O()
{
std::cout << "~O()\n";
}
};
struct wrapper
{
O const& val;
~wrapper()
{
std::cout << "~wrapper()\n";
}
};
struct wrapperEx // with explicit ctor
{
O const& val;
explicit wrapperEx(O const& val)
: val(val)
{}
~wrapperEx()
{
std::cout << "~wrapperEx()\n";
}
};
template<class T>
T&& f(T&& t)
{
return std::forward<T>(t);
}
int main()
{
std::cout << "case 1-----------\n";
{
auto&& a = wrapper{O()};
std::cout << "end-scope\n";
}
std::cout << "case 2-----------\n";
{ …Run Code Online (Sandbox Code Playgroud) 在阅读Herb Sutter博客上的这篇文章后,我进行了一些实验,遇到了令我困惑的事情.我正在使用Visual C++ 2005,但如果这依赖于实现,我会感到惊讶.
这是我的代码:
#include <iostream>
using namespace std;
struct Base {
//Base() {}
~Base() { cout << "~Base()" << endl; }
};
int main()
{
const Base & f = Base();
}
Run Code Online (Sandbox Code Playgroud)
运行时,它会显示两次 " ~Base()" 但是如果我取消对构造函数的注释,它只会显示一次!
有没有人对此有解释?
假设我想将临时对象传递给函数.有没有办法在1行代码中对比2,用结构?
有了课,我可以做:
class_func(TestClass(5, 7));
Run Code Online (Sandbox Code Playgroud)
给定:
class TestClass
{
private:
int a;
short b;
public:
TestClass(int a_a, short a_b) : a(a_a), b(a_b)
{
}
int A() const
{
return a;
}
short B() const
{
return b;
}
};
void class_func(const TestClass & a_class)
{
printf("%d %d\n", a_class.A(), a_class.B());
}
Run Code Online (Sandbox Code Playgroud)
现在,我如何使用结构?我最接近的是:
test_struct new_struct = { 5, 7 };
struct_func(new_struct);
Run Code Online (Sandbox Code Playgroud)
给定:
struct test_struct
{
int a;
short b;
};
void struct_func(const test_struct & a_struct)
{
printf("%d %d\n", a_struct.a, a_struct.b);
}
Run Code Online (Sandbox Code Playgroud)
对象更简单,但我想知道是否有一种方法可以根据函数调用进行结构成员初始化,而不给结构提供构造函数.(我不想要一个构造函数.我使用结构的全部原因是避免在这个孤立的情况下使用样板get/set类约定.)
我们目前正忙于从Visual Studio 2005迁移到Visual Studio 2010(使用非托管C/C++).这意味着我们大约一半的开发人员已经在使用Visual Studio 2010,而另一半仍在使用Visual Studio 2005.最近,我遇到了一种情况,在Visual Studio 2010中可以以干净的方式编写某种构造,但是在Visual Studio 2005中需要不太干净的源代码.因为并非所有开发人员都在其计算机上安装了Visual Studio 2010,所以我必须编写如下代码:
#if _MSC_VER >= 1600
// clean version of the source code
#else
// less clean version
// of the source code
// requiring multiple lines of code
// and requiring some dirty static_casts
#endif
Run Code Online (Sandbox Code Playgroud)
由于所有开发人员将在今年年底之前迁移到Visual Studio 2010,因此我希望此代码在某个时刻后自动"消失".在源代码中保持"不太干净的版本"会导致长期不可读的源代码.
当然,我知道代码不会自动消失,所以我真的想在一定时刻后自动响铃.像这样的东西:
#if _MSC_VER >= 1600
// clean version of the source code
#else
// less clean version
// of the source code
// requiring multiple lines of code …Run Code Online (Sandbox Code Playgroud) 我读过它NSTemporaryDirectory()返回一个临时目录的字符串,但也可能返回nil.这是iOS中的情况吗?有没有经历过NSTemporaryDirectory()返回零?它什么时候发生?
如果我必须准备好NSTemporaryDirectory()可以返回零,那么我完全使用它是没有意义的.如果我必须提供回退机制,我可以首先使用这种机制.
那么创建临时目录的简单而安全的方法是什么?
我理解做类似以下的事情:
auto&& x = Matrix1() + Matrix2() + Matrix3();
std::cout << x(2,3) << std::endl;
Run Code Online (Sandbox Code Playgroud)
如果矩阵运算使用表达式模板(例如boost::ublas),将导致静默运行时错误.
是否有任何设计表达式模板的方法来防止编译器编译可能导致在运行时使用过期临时值的代码?
(我尝试解决这个问题没有成功,尝试就在这里)
我的程序中需要一个临时表.我已经看到这可以通过这种方式使用"mapper"语法实现:
t = Table(
't', metadata,
Column('id', Integer, primary_key=True),
# ...
prefixes=['TEMPORARY'],
)
Run Code Online (Sandbox Code Playgroud)
看到这里
但是,我的整个代码都使用了声明性基础,这是我所理解的,我想坚持下去.有可能使用混合方法, 但如果可能的话我会避免它.
这是我的声明性类的简化版本:
import SQLAlchemy as alc
class Tempo(Base):
"""
Class for temporary table used to process data coming from xlsx
@param Base Declarative Base
"""
# TODO: make it completely temporary
__tablename__ = 'tempo'
drw = alc.Column(alc.String)
date = alc.Column(alc.Date)
check_number = alc.Column(alc.Integer)
Run Code Online (Sandbox Code Playgroud)
提前致谢!
编辑新问题:
现在这个类看起来像这样:
import SQLAlchemy as alc
class Tempo(Base):
"""
Class for temporary table used to process data coming from …Run Code Online (Sandbox Code Playgroud) 我从今天关于SQLite的书中读到关键词":memory:",但它只说它是什么,如何使用,解释太短.所以我在这里搜索了更多信息,但无法获得SQLite特定信息.
"记忆:"模式有哪些优点?(我什么时候需要这个?)
内存数据库的性能更快?
我是否仍需要在内存数据库中使用事务?