编辑:我认为我所问的最有可能的用例是创建一个从 接收右值引用元组的函数时std::forward_as_tuple()。
想到这个问题的原因是因为我正在检查传递给构造函数初始值设定项的对象的成员,看看它们是否是右值引用(我愿意接受建议,告诉我这是错误的错误错误......希望后面跟着一个根据经验,避免将来出现这种情况,但这就是引发问题的原因)。我想到,在稍微不同的上下文中,我可能最终会将具有右值引用成员的对象传递给我可能控制或可能不控制的多个函数(或函数对象),这些函数可能会从这些成员进行移动。
template<typename... Args>
void my_func(std::tuple<Args...>&& tup) {
//if tup's members are rvalue references,
//and this function moves guts from tup members, then...
func_i_dont_control(tup);
//what happens here if moves are done on the same members?
another_func_i_dont_control(std::move(tup));
}
Run Code Online (Sandbox Code Playgroud)
我看过使用右值引用成员?,以及右值引用成员的一些其他讨论,但我不太能够明确地解决这个问题。
我不只是问会发生什么,而是问这种情况是否应该/可能发生,以及在传递包含右值引用成员的对象时要记住哪些关键规则。
我在 g++ 和在 Ubuntu 下使用蓝牙库的 C/C++ 程序的编译过程中遇到了一些问题。
如果我使用 gcc,它工作正常,没有任何警告;相反,如果我使用 g++ 我会收到此警告:
警告:正在获取临时地址
即使程序编译良好并且可以工作。
报告错误涉及的行是:
bdaddr_t *inquiry(){
// do some stuff..
bacpy(&result[mote++], BDADDR_ANY);
return result;
}
//...
void zeemote(){
while (bacmp(bdaddr, BDADDR_ANY)){
/..
}
}
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,都涉及 BDADDR_ANY。
我该如何解决这个警告?
BDADDR_ANY 在 bluetooth.h 中定义如下:
/* BD Address */
typedef struct {
uint8_t b[6];
} __attribute__((packed)) bdaddr_t;
#define BDADDR_ANY (&(bdaddr_t) {{0, 0, 0, 0, 0, 0}})
Run Code Online (Sandbox Code Playgroud) 我们在过程中创建临时表,我们没有为 mysql 使用持久连接。mysql重启后有很多临时表在缓慢增加然后innodb_buffer_pool_size完成。
应用程序正在此服务器上运行;
CPU E3-1245 v5 @ 3.50GHz - 8 核 16GB 内存
图像显示 tmp 表如何增加:

我的.cnf:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
skip_name_resolve
join_buffer_size = 4M
sort_buffer_size = 1M
read_rnd_buffer_size = 1M
# MyISAM #
key_buffer_size = 1G
# SAFETY #
max_allowed_packet = 1G
# CACHES AND LIMITS #
tmp_table_size = 16M
max_heap_table_size = 16M
query_cache_type = 1
query_cache_size = 1M
query_cache_limit = 1M
max_connections = 400
thread_cache_size = 100
open_files_limit = 65535
table_definition_cache = 4096
table_open_cache = 4096 …Run Code Online (Sandbox Code Playgroud) 我发现oracle中临时表的概念与SQL Server等其他数据库有很大不同。在Oracle中,我们有一个全局临时表的概念,我们只创建它一次,并且在每个会话中我们用与其他数据库中不同的数据填充它。
在 18c 中,oracle 引入了私有临时表的概念,该概念指出,在成功使用后,可以像其他数据库一样删除表。但是我们如何在 PL/SQL 块中使用它呢?
我尝试使用动态 SQL - 来使用它EXECUTE IMMEDIATE。但它给了我表必须声明错误。我在这里做什么?
让我们举一个例子,我们需要将从一个函数返回的向量插入到另一个向量中:
const std::vector<int> getvec(){
return {1, 2, 3};
}
// in main...
std::vector<int> foo{ 11, 12 };
auto bar = getvec();
foo.insert(foo.end(), bar.begin(), bar.end());
Run Code Online (Sandbox Code Playgroud)
由于该bar变量需要在方法中引用两次,insert()因此有必要将向量存储为变量(如果foo.myinsert(getvec())有这样的接口,我们也可以这样做)。
让我有点恼火的是,在这种情况下,我们需要foo在主作用域中引入一个变量,该变量不应在其余代码中再次使用,因为它占用内存并污染命名空间。如果我们谈论的是一个大的“临时”对象,这尤其是一个问题。
有没有标准的方法来处理这个问题?我们可以定义一个仅接受“临时”对象一次的函数,以便我们可以直接将函数输出提供给它,但如果我们需要为每个类似的场景定义这样的函数,那么将很难管理。同样在这个例子中,我们无法为vector类定义成员函数。
或者使用大括号来限制插入的“临时”部分的范围,但我想知道这里是否有任何警告。
vector<int> foo{ 11, 12 };
{ // extra brace here
auto bar = getvec();
foo.insert(foo.end(), bar.begin(), bar.end());
} // extra brace here
Run Code Online (Sandbox Code Playgroud) 谁能解释为什么以下代码无法编译(在g ++(GCC)3.2.3 20030502(Red Hat Linux 3.2.3-49))?
struct X {
public:
enum State { A, B, C };
X(State s) {}
};
int main()
{
X(X::A);
}
Run Code Online (Sandbox Code Playgroud)
我收到的消息是:
jjj.cpp:在函数'int main()'中:
jjj.cpp:10:'XX :: A'不是'struct
X'jjj.cpp 的静态成员:10:没有用于调用'X的匹配函数: :X()'
jjj.cpp:1:候选者是:X :: X(const X&)
jjj.cpp:5:X :: X(X :: State)`
这是错误的代码还是编译器错误?
Neil + Konrad解决了问题.请参阅下面对Neil的回答的评论.
我已经阅读了C++面试问题的答案,其中有一个令我困惑的问题:
问:C++编译器何时创建临时变量?
答:如果函数参数是"const引用",则编译器按以下两种方式生成临时变量.
a)实际参数是正确的类型,但它不是Lvalue
Run Code Online (Sandbox Code Playgroud)double Cube(const double & num) { num = num * num * num; return num; } double temp = 2.0; double value = cube(3.0 + temp); // argument is a expression and not a Lvalueb)实际参数的类型错误,但是可以转换为正确类型的类型
Run Code Online (Sandbox Code Playgroud)long temp = 3L; double value = cuberoot(temp); // long to double conversion
我的问题是,一旦函数参数是一个const引用,为什么编译器生成临时变量,是不是自相矛盾?此外,如果函数Cube无法编译,因为它修改了const参数?
有人可以告诉为什么test(2)对象在test_method()通话后被销毁了?
#include<iostream>
#include<string>
using namespace std;
class test
{
int n;
public:
test(int n) : n(n)
{
cout << "test: " << n << endl;
}
~test()
{
cout << "~test: " << n << endl;
}
test & test_method()
{
cout << "test_method: " << n << endl;
return *this;
}
};
int main(int argc, const char *argv[])
{
cout << "main start" << endl;
const test &test1 = test(1);
const test &test2 = test(2).test_method(); …Run Code Online (Sandbox Code Playgroud) 在MySQL中,可以在WHERE子句中使用临时变量吗?
例如,在以下查询中:
SELECT `id`, @var := `id` * 2 FROM `user`
Run Code Online (Sandbox Code Playgroud)
@var成功设置为`id`值的两倍
但是,如果我尝试将结果集过滤为仅包含@var小于10的结果:
SELECT `id`, @var := `id` * 2 FROM `user` WHERE @var < 10
Run Code Online (Sandbox Code Playgroud)
然后我没有结果.
如何根据@var的值过滤结果?
如何保存一些临时数据,以便在关闭应用程序时所有数据都消失了?我尝试过sharedPreferences但是当我再次打开应用程序时,似乎数据仍然存在.
我听说你可以将数据保存到某些缓存中,但是如果内存在应用程序启动并运行时被"填满",我真的不希望数据消失.也许我应该选择一些全局变量?不是我知道如何让它工作.
我的简单应用程序,即"游戏",可以在您更进一步时打开和关闭活动.它基本上是一个充满愚蠢图片的游戏^^.已经在一个活动中完成的东西应该保存在某个地方,所以如果我回去,我可以加载数据并使其看起来像是在活动关闭之前.我希望你明白我在说什么..
任何想法如何我可以存储一些在您需要时也很容易访问的信息.