如果我定义了一个复制赋值运算符,它使用class的pass by值来调用复制构造函数thing:
thing& operator= (thing x) {
Run Code Online (Sandbox Code Playgroud)
和同一个类的移动赋值运算符:
thing& operator= (thing&& x) {
Run Code Online (Sandbox Code Playgroud)
尝试调用移动分配会导致gcc出错:
error: ambiguous overload for ‘operator=’ (operand types are ‘thing’ and ‘std::remove_reference<thing&>::type {aka thing}’)
Run Code Online (Sandbox Code Playgroud)
但是,如果副本分配使用传递引用:
thing& operator= (thing& x) {
Run Code Online (Sandbox Code Playgroud)
编译很好,可以调用两个运算符.为什么是这样?
完整的C++ 11测试代码:
#include <iostream>
#include <utility>
using namespace std;
class thing {
public:
thing () { }
thing (thing& x) {
cout << "Copy constructor.\n";
}
thing (thing&& x) {
cout << "Move constructor.\n";
}
thing& operator= (thing x) {
cout << "Copy assign …Run Code Online (Sandbox Code Playgroud) 我有一个自定义的TextView,它实现了三个View构造函数(nb,这是我在Android应用程序中的第一次尝试):
public class DynamicGeometryTextView extends TextView {
public DynamicGeometryTextView (Context con) { super(con); }
public DynamicGeometryTextView (Context con, AttributeSet attrs) {
super(con, attrs);
}
public DynamicGeometryTextView (Context con, AttributeSet attrs, int style) {
super(con, attrs, style);
}
Run Code Online (Sandbox Code Playgroud)
这是一个非静态内部类,因为它需要从外部类访问实例数据.它出现在.xml布局中:
<view class="cogdis.chalkboard.DisplayText$DynamicGeometryTextView"
android:id="@+id/chalkboard"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
Run Code Online (Sandbox Code Playgroud)
一切都编译和安装很好,但在运行时:
Caused by: android.view.InflateException: Binary XML file line #7: Error inflating class cogdis.chalkboard.DisplayText$DynamicGeometryTextView
at android.view.LayoutInflater.createView(LayoutInflater.java:596)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:256)
at android.app.Activity.setContentView(Activity.java:1867)
at cogdis.chalkboard.DisplayText.onCreate(DisplayText.java:26)
at android.app.Activity.performCreate(Activity.java:5008)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
at …Run Code Online (Sandbox Code Playgroud) 我有一个构造函数,其签名是这样的:
cpuInput (const std::string &label);
Run Code Online (Sandbox Code Playgroud)
实际的构造函数使用引用超构造函数的初始化列表,所以它看起来像这样:
cpuInput::cpuInput (const string &label) : StateMonitor::input(label) { }
Run Code Online (Sandbox Code Playgroud)
该类编译为目标文件.如果我将该文件与调用构造函数的驱动程序一起编译:
cpuInput *cpu = new cpuInput();
Run Code Online (Sandbox Code Playgroud)
我当然得到一个错误g++:
demo.cpp:15:31: error: no matching function for call to ‘cpuInput::cpuInput()’
demo.cpp:15:31: note: candidates are:
In file included from demo.cpp:3:0:
input_cpusage/cpuInput.hpp:7:3: note: cpuInput::cpuInput(const string&)
Run Code Online (Sandbox Code Playgroud)
现在这里是奇怪的部分:如果我将构造函数调用更改为:
cpuInput *cpu = new cpuInput("cpu");
Run Code Online (Sandbox Code Playgroud)
并将其他所有内容保持不变,我现在得到:
demo.cpp:15: undefined reference to `cpuInput::cpuInput(std::string const&)'
Run Code Online (Sandbox Code Playgroud)
我意识到这const string&并不完全相同string const&,但我认为这是在C++中传递字符串引用(在这种情况下,通过从const char*转换)的标准方法,并且:
class A {
public:
A (const string &s) : x(s) { cout << x …Run Code Online (Sandbox Code Playgroud) 我有一个有效的交叉编译工具链,感谢crosstool-ng :) - 然而,crosstool-ng的文档很少,而且我是交叉编译的全新工具.我认为,具体的主持人和目标在这方面并不重要.
我有一些关于目录结构的基本问题.工具链安装在以目标命名的目录中.里面是一组目录:
arm-unknown-linux-gnueabi
bin
include
lib
libexec
share
Run Code Online (Sandbox Code Playgroud)
我认为这是针对实际的交叉编译器位,因为bin /中的编译器可以用于此目的.请注意,有一个内部arm-unknown-linux-gnueabi /目录,即其中的路径../arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi.里面还有另一棵树:
bin
debug-root
include
lib
lib32
lib64
sysroot
Run Code Online (Sandbox Code Playgroud)
lib*目录是sysroot /的符号链接.bin中的东西似乎与父目录/ bin中的交叉编译工具集相同:
> bin/gcc -v
Using built-in specs.
COLLECT_GCC=./gcc
Target: arm-unknown-linux-gnueabi
Configured with: /usr/x-tool/.build/src/gcc-4.7.2/configure
--build=x86_64-build_unknown-linux-gnu
--host=x86_64-build_unknown-linux-gnu
--target=arm-unknown-linux-gnueabi
Run Code Online (Sandbox Code Playgroud)
所以我的第一个问题是:这些是为了什么?这个目录是什么?
我的第二个问题是:sysroot /应该如何使用?它显然是针对目标平台本地的支持库,所以我假设我是否正在构建这样的库我应该使用它--prefix,尽管它与使用父目录相同,因为lib*是符号链接的...这个"中间目录"的bin和符号链接到sysroot是令人困惑的.我相信(某些)autotools样式包可以配置"--with-sysroot". 如果我看到它,那么它的意义是什么?它应该如何用于其他选项,如--prefix等?
这个:
#include <iostream>
#include <sstream>
#include <inttypes.h>
using namespace std;
int main (void) {
istringstream iss("123 42");
int8_t x;
while (iss >> x) {
cout << x << endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
产生:
1
2
3
4
2
Run Code Online (Sandbox Code Playgroud)
但我想要:
123
42
Run Code Online (Sandbox Code Playgroud)
转换iss >> (int)x(我最初用 a 尝试过char)给了我“错误:二进制表达式的无效操作数('istringstream'(又名'basic_istringstream')和'int')”(clang)或“错误:'operator>>'的模糊重载" (g++)。
有没有办法将值作为数字直接读入8 位类型,还是必须使用中间存储?
虽然这个重复是一个非常相似的问题,但它早于我所询问的方法(“导入的对象库”),该方法在大约 1 年前的版本 3.9.6 中添加到 Cmake 中(?),因此那里的答案都没有解决这。
我刚刚开始使用 cmake,并且尝试或多或少地从 makefile 复制这种行为:
foo: foo.cpp bar.o
$(CXX) $^ -o $@
bar.o:
cp $(EXTERNAL_DIR)/bar.o .
Run Code Online (Sandbox Code Playgroud)
所以bar.o只是从外部复制进来。它没有被构建,等等。然后它被编译到foo目标中。
在 Cmake 文档中,这看起来非常简单;导入 .o 文件:
add_library(bar OBJECT IMPORTED GLOBAL)
set_property(TARGET bar PROPERTY IMPORTED_LOCATION ${EXTERNAL_DIR}/bar.o)
Run Code Online (Sandbox Code Playgroud)
并使用它:
add_executable(foo $<TARGET_OBJECTS:bar> foo.cpp)
Run Code Online (Sandbox Code Playgroud)
但是当构建运行时,我得到了所有应该包含的内容丢失的符号bar.o——并且详细地运行,原因很清楚:Cmake从不将它用于任何用途。它没有在编译器调用中提到,并且在构建目录中进行 grep 操作,也没有在任何生成的 makefile 中提到。
此外,我可以将 更改IMPORTED_LOCATION为不存在的东西,它并不关心。它的运行方式完全相同。
我在这里误解了什么?我如何完成此任务(并且无需添加任何内容EXTERNAL_DIR)?
我一直理解@+id指示创建一个新的ID(通常与 一起使用android:id),并@id在其他地方引用它,正如这里的一个流行问题和官方文档中详细解释的那样:
字符串开头的 at 符号 (@) 指示 XML 解析器应解析并扩展 ID 字符串的其余部分,并将其标识为 ID 资源。加号 (+) 表示这是一个必须创建的新资源名称并将其添加到我们的资源中(在 R.java 文件中)。Android 框架还提供了许多其他 ID 资源。引用Android资源ID时,不需要加号,但必须添加android包命名空间...
这一点没有得到强制执行,这有点奇怪。您可以在任何地方使用@+id相同的 id 多次,这似乎不是错误或问题(除非您在多个android:id声明中使用相同的 id)。
当在 Android Studio 中使用具有约束布局的图形设计器时(实际上它可以与所有内容一起使用,我还没有检查),每当添加约束时,它都会像这样声明它们:
app:layout_constraintTop_toBottomOf="@+id/rlistfrag"
Run Code Online (Sandbox Code Playgroud)
whererlistfrag被分配给android:id同一文件中的另一个元素——如果它尚不存在,则设计者无法创建约束,因此不会存在上下文歧义。1 根据文档,这相当于两次声明“必须创建并添加到我们的资源中的新资源名称”。
至少由于遗漏,这里的语义似乎并不完全如文档中所描述的那样。设计者为什么要这样做?那些省略的语义是什么?
布局资源的文档指南中有一些内容确认 id 只会在第一次设置:
加号 + 表示这是一个新的资源 ID,aapt 工具将在 R.java 类中创建一个新的资源整数(如果它尚不存在)。
这并不意味着元素没有按顺序处理。
我接受的答案读这里的是:
[a]不会为显式声明移动构造函数或移动赋值运算符的类生成复制构造函数和复制赋值运算符
我注意到(g ++ 4.7.2),如果你定义一个移动构造函数,它将与例如一起使用push_back(),而如果你所做的只是= delete复制构造函数,你就不会得到一个隐式移动构造函数 - 你得到一个错误. [...这让我想知道如果你没有明确地做任何事情,实际使用哪一个(移动或复制)...]
然而,本次网上参考不做出关于拷贝构造函数相同的明确承诺不会在定义转移构造函数被隐式定义.
所以我的问题是,标准保证的第一个报价(包括"或")?我宁愿,一些类这就需要一个明确的析构函数,只需移动构造函数和(删除)家移动运营商,完成"五规则",靠的是隐含的复制方法不被定义.如果我不能依赖它,那么我将不得不明确=delete它们 - 但这是很多潜在的冗余.
我正在解析一些UTF-8文本,但我只对ASCII范围内的字符感兴趣,即我可以跳过多字节序列.
我可以很容易地检测到序列的开始,因为符号位已设置,因此char值<0.但是如何判断序列中有多少字节,以便我可以跳过它?
我不需要执行任何验证,即,我可以假设输入是有效的UTF-8.
我正在尝试让 cmake(在 linux 上)创建一些静态对象 (.o) 文件并将它们安装到外部目录。为此,我有一个列表,object_sources包含源的项目路径,并将其放在顶层CMakeLists.txt:
set(local_objects "")
foreach(file ${object_sources})
get_filename_component(cur ${file} NAME_WE)
add_library("${cur}.o" OBJECT ${file})
list(APPEND local_objects "${cur}.o")
# To confirm these variables are what I think they are:
message("---> ${cur} | ${file}")
endforeach()
install(
# Also tried FILES, see below.
TARGETS ${local_objects}
CONFIGURATIONS Debug
# Also tried nothing instead of 'OBJECTS' (same outcome)
# and LIBRARY (cmake fails on error).
OBJECTS
DESTINATION "/some/external/dir"
)
Run Code Online (Sandbox Code Playgroud)
关于 using FILES,它无法工作,因为实际上 afoo.o从未创建过,因此我尝试获得正确的项目路径毫无意义。
当我到达makecmake …
我有一个用于 RSA 交换的私钥,该私钥受密码保护。我知道密码,所以我可以使用密钥,但是,我不知道使用哪个密码来设置密码。
我还有其他密钥,其中密码在解密密钥的标头中命名,根据此问题的答案。然而,这个密钥在加密时只是简单地开始:
-----BEGIN ENCRYPTED PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)
解密后:
-----BEGIN RSA PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)
没有进一步的标题。
诸如openssl rsa和 gnutls 之类的工具certtool -k会在给出密码时解密密钥,并提供有关公钥的信息,但不会透露有关密码所使用的对称密码的任何信息。
据推测,这些应用程序知道密码是什么,因为它们解密了密钥。有没有办法获取这些信息?无论如何,如果我有密码,保密似乎没有多大意义。
使用 gnutls API(但不是 openssl)的编程答案很好,但理想情况下我想知道现有的便携式工具。
给出以下最小例子:
foo.hpp:
class foo {
public:
enum bar {
ONE,
TWO,
THREE
};
bar b;
foo ();
};
Run Code Online (Sandbox Code Playgroud)
Foo.cpp中:
#include "foo.hpp"
foo::foo () : b(ONE) { }
Run Code Online (Sandbox Code Playgroud)
我怎么能做我在下面尝试做的事情?
#include "foo.hpp"
int main () {
foo *f = new foo();
/* None of these work:
f->b = TWO;
f->b = foo::bar::TWO;
f->b = bar::TWO;
*/
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我倾向于这样的结论:这在C++中不是惯用的,我必须将枚举包装在外部命名空间中,否则重新组织.有哪些选择和/或最佳实践?
c++ ×6
android ×2
cmake ×2
g++ ×2
build ×1
c ×1
c++11 ×1
constructor ×1
crosstool-ng ×1
designer ×1
enums ×1
gnutls ×1
linux ×1
makefile ×1
nested ×1
private-key ×1
rsa ×1
stringstream ×1
utf-8 ×1