我已经从苹果网站(不是苹果商店)下载并安装了 Xcode 12.4,因为我使用的是 macOS Catalina 10.15.7,而最新的 Xcode 版本现在至少需要 BigSur 11.0。我还安装了最新的 Xcode 命令行工具。
\n\n但是当我尝试从终端使用 Xcode 模拟器打开我的 React Native 项目时,npm run ios它说:
“需要安装 Xcode(不用担心,您不必使用它),您想继续访问 App Store 吗?\xe2\x80\xba(是/否)”
\n\n顺便说一句,我是一个新的 mac 用户,所以我对它还不太了解。因此,任何形式的帮助将不胜感激。
\n澄清英语中可能的优先歧义:我们正在采取"智能(指向成员的指针)",而不是"(智能指针)成员".
我会将一个指向成员的智能指针定义为带有operator ->* (T* lhs, X rhs)重载的类X.
在他的文章"实现操作符 - >*用于智能指针"中,Scott Meyers只是简单地触及指向成员的智能指针,因为当时(1999)特定问题对于成员的原始指针来说已经足够困难了(旁注:后者优雅地解决了)这里有lambdas ).
无论如何,Scott Meyers写了一个脚注:
在撰写本文草稿后不久,我的一位咨询客户向我展示了一个问题,这个问题通过智能指向成员的方式自然而然地解决了.我也很惊讶.
我试图找到一个这样一个成员的自然智能指针的例子.但是我既不能自己想出任何东西,也没有在线搜索发现我在寻找什么.
你知道任何现实世界"成员智能指针"的例子吗?
编辑:我不是在寻找任何->*过载(如某些EDSL所做的那样).针对具有类似内置语义的语义示例->*,我上面的定义明确要求lhs是一个原始指针.
clang 8.0.0引入了对char8_t从c ++ 20开始的类型的支持。但是,我希望以下函数具有相同的编译器输出
#include <algorithm>
bool compare4(char const* pcha, char const* pchB, int n) {
return std::equal(pcha, pcha+4, pchB);
}
bool compare4(char8_t const* pchA, char8_t const* pchB, int n) {
return std::equal(pchA, pchA+4, pchB);
}
Run Code Online (Sandbox Code Playgroud)
然而,他们编译下-std=c++2a -O2到
compare4(char const*, char const*, int): # @compare4(char const*, char const*, int)
mov eax, dword ptr [rdi]
cmp eax, dword ptr [rsi]
sete al
ret
_Z8compare4PKDuS0_i: # @_Z8compare4PKDuS0_i
mov al, byte ptr [rdi]
cmp al, byte ptr …Run Code Online (Sandbox Code Playgroud) 在 C++20 中,u8字符串文字基于char8_t类型。他们故意不再转换为char const*:
const char* str = u8"Hall\u00f6chen \u2603"; // no longer valid in C++20
Run Code Online (Sandbox Code Playgroud)
当然,迁移到 C++20 时的最终目标是完全采用新行为(在上面的示例中:更改 的类型str)。但是,由于 3rd 方库,这通常无法立即实现。
引入和“补救” 的提案char8_t预计并提到在 clang 和 gcc 中有-fno-char8_t切换回旧行为的标志(同时仍然能够享受其他 C++20 功能)。
第二个提案设定了 Microsoft 将遵循并添加类似标志的期望,但我找不到如何设置它(至少在 VS 2019 版本 16.4 中)。
那么有谁知道 MSVC 的等价物-fno-char8_t是什么?
我有一个名为branch的分支0726b,我希望将当前工作副本与该分支区分开来.显然,还有一个提交,它具有从该序列开始的哈希,因为我得到了
$ git diff 0726b
warning: refname '0726b' is ambiguous.
Run Code Online (Sandbox Code Playgroud)
我如何告诉git它应该将参数作为分支名称?
对于某些标准库类,对其部分内容的访问可能会合法地失败。通常你可以在一些潜在的抛出方法和一个被标记的方法之间进行选择noexcept。后者免去了对前提条件的检查,所以如果你想自己承担责任,你可以。这可以在不允许使用异常或修复性能瓶颈的情况下使用。
示例 1:std::vector元素访问:
std::vector<int> vec;
vec.at(n) // throws std::out_of_range
vec[n] // potentially UB, thus your own responsibility
Run Code Online (Sandbox Code Playgroud)
示例 2:std::optional访问:
std::optional<int> optn;
optn.value() // throws std::bad_optional_access
*optn // potentially UB, thus your own responsibility
Run Code Online (Sandbox Code Playgroud)
现在到std::variant. 直接访问替代品在某种程度上遵循以下模式:
std::variant<std::string, int> var;
std::get<int>(var) // potentially throwing std::bad_variant_access
*std::get_if<int>(&var) // potentially UB, thus your own responsibility
Run Code Online (Sandbox Code Playgroud)
但这一次签名发生了变化,我们必须注入*和&。这样做的缺点是我们没有获得自动移动语义。还有一件事要记住......
但如果你看一下,情况会变得更糟std::visit(Visitor&& vis, Variants&&... vars)。它别无选择noexcept,虽然它只会抛出
如果 vars 中的任何变体是valueless_by_exception。
这意味着对于访问变体您不能选择自己承担责任,如果您别无选择且必须避免异常,则您根本无法std::variants使用标准工具访问!(除了可怕的解决方法 …
在实际代码中,构造函数可能非常复杂,因此emplaceastd::optional可以查询可选本身的状态。当这种情况发生时,它通常会更复杂一些,但这是一个(人为的)最小示例:
#include <iostream>
#include <optional>
struct Thing {
Thing();
};
std::optional<Thing> othing;
Thing::Thing() {
std::cout << othing.has_value() << std::endl;
}
int main() {
othing.emplace();
}
Run Code Online (Sandbox Code Playgroud)
对于所有三个主要的标准库实现,这将产生false. 换句话说,在嵌入构造函数的执行过程中,可选项不包含值。
从实现的角度来看,这意味着首先就地构造值,然后设置一些簿记变量。这确实是MSVC、libc++和libstdc++ 的情况。
[...] 当 的实例
optional<T>包含一个 value 时,这意味着 T 类型的对象,称为可选对象的包含 value,在可选对象的存储中分配。
有趣的是,这并没有使用所包含对象的明确定义的生命周期(我想是因为这可以从外部强制结束,例如othing->~Thing()),而是在存储中分配的术语。该标准通常在动态内存的上下文中谈论分配,在这些情况下,分配显然发生在构造之前。
所以我认为提到的标准库实现不兼容,簿记变量应该在构建开始之前设置。
在这种假设下,仍然存在一个问题:实现是否比标准更好,而不是后者需要修复或澄清?我不这么认为:在构造大对象期间,访问已经初始化的子对象是完全有效且常见的,因此这对于包含在可选对象中的对象也应该是可能的。
那么我的考虑是否正确?或者我对分配范围内的术语的解释不正确?是否有反对我的 RightThing™ …
当我在 Xcode 中重复构建版本时,生成的 dSYM 完全为空,因此调试器无法显示任何内容。
我已经能够用Xcode 11.3.1中的最小项目重现此内容,如下所示:
DEPLOYMENT_POSTPROCESSING将for设置Release为YESBuild ConfigurationReleaseInfo.plist现在, GenerateDSYMFile步骤中的构建日志中有一条警告
warning: no debug symbols in executable (-arch x86_64)
Run Code Online (Sandbox Code Playgroud)
如果运行生成的应用程序,将不会有调试信息(您无法在 Xcode 中设置断点,如果您手动中断堆栈帧将只是___lldb_unnamed_symbol,...)
Xcode 构建过程的相关部分似乎是:
因此,1) 在重复构建中被跳过,因为源(以及目标文件)没有改变。2) 被执行,因为Info.plist已更改,但它对已被先前构建剥离的二进制文件进行操作。因此,dSYM 为空。
看起来 2) 应该只在与 1) 相同的条件下重新运行,但这些依赖项似乎在 Xcode 中是硬连线的......
有什么办法可以解决这个问题吗?
标准库实用程序declval被定义为:
template<class T> add_rvalue_reference_t<T> declval() noexcept;
Run Code Online (Sandbox Code Playgroud)
在这里添加右值引用似乎是一个好主意,如果您考虑一下C++11 中引入的语言:返回值涉及一个临时值,该值随后被移出。现在C++17引入了保证复制省略,这不再适用。正如cppref所说:
纯右值和临时值的 C++17 核心语言规范与早期 C++ 修订版的核心语言规范根本不同:不再有临时值可以复制/移动。描述 C++17 机制的另一种方法是“非物化值传递”:返回和使用纯右值,而不会物化临时值。
这对其他以declval. 看看这个例子(在Godbolt.org上查看):
#include <type_traits>
struct Class {
explicit Class() noexcept {}
Class& operator=(Class&&) noexcept = delete;
};
Class getClass() {
return Class();
}
void test() noexcept {
Class c{getClass()}; // succeeds in C++17 because of guaranteed copy elision
}
static_assert(std::is_constructible<Class, Class>::value); // fails …Run Code Online (Sandbox Code Playgroud) 借助 c++11 的新特性,我们可以进行 In-class 成员初始化。但是仍然不能在类中定义静态数据成员。
class A
{
static const int i = 10;
int j = 10;
const int k = 20;
static int m = 10; // error: non-const static data member must be initialized out of line
};
Run Code Online (Sandbox Code Playgroud)
为什么不提供此功能?
c++ ×7
c++17 ×3
c++20 ×2
xcode ×2
c++11 ×1
char8-t ×1
clang ×1
copy-elision ×1
declval ×1
dsym ×1
dsymutil ×1
git ×1
git-branch ×1
git-diff ×1
macos ×1
noexcept ×1
operators ×1
pointers ×1
static ×1
stdoptional ×1
variant ×1
visual-c++ ×1
xcodebuild ×1