直到最近,人们还可以方便地下载 Mozilla 的开发人员文档,developer.mozilla.org.tar.gz以供离线阅读。然而,Mozilla 似乎已将文档升级为新的基于 SQL 的格式,放弃了旧的 TAR.GZ。
人们不怀疑这样的升级是好的,但是我不明白升级,所以现在我很困惑。我现在应该如何离线阅读 Mozilla 的开发人员文档?
参考
thread_local在块范围内使用变量有什么用?
如果一个可编译的示例有助于说明问题,这里是:
#include <thread>
#include <iostream>
namespace My {
    void f(int *const p) {++*p;}
}
int main()
{
    thread_local int n {42};
    std::thread t(My::f, &n);
    t.join();
    std::cout << n << "\n";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出: 43
在示例中,新线程有自己的,n但(据我所知)不能用它做任何有趣的事情,所以为什么要麻烦呢?新线程自己的n有什么用吗?如果它没有用,那又有什么意义呢?
当然,我认为有是一个点。我只是不知道这有什么意义。这就是我问的原因。
如果新线程自己n想要(如我所想)在运行时由 CPU 进行特殊处理——也许是因为,在机器代码级别,人们无法n通过从新线程的基指针的预先计算的偏移量以正常方式访问自己的线程堆栈——那我们岂不是白白浪费机器周期和电力?然而即使不需要特殊处理,仍然没有收获!不是我能看到的。
那么为什么thread_local在块范围内?
参考
thread_local和其他存储类我想要一个类型A,它将隐藏的数据输出到类型为T的对象,但是隐藏其他人的数据.我的C++编译器碰巧是GCC 4.4,但这并不重要.为什么这不起作用?
#include <iostream>
template <class T> class A {
  private:
    int n1;
  public:
    friend class T;
    A(const int n0 = 0) : n1(n0) {}
};
class B {
  public:
    int f(const A<B> a) const { return a.n1; }
    B() {}
};
int main() {
    const A<B> a(5);
    const B b;
    const int m = b.f(a);
    std::cout << m << "\n";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
顺便说一下,这样可以正常工作,除了它无法隐藏数据:
#include <iostream>
template <class T> class A {
  private:
    int n1; …Run Code Online (Sandbox Code Playgroud) GCC的内联汇编程序识别声明符=r和=&r.这些对我来说很有意义:=r让汇编器重用输入寄存器来输出.
但是,GCC的内联汇编程序也承认声明者+r和+&r.这些对我来说不太合理.毕竟,是不是区别+r和+&r区别没有区别?是否+r仅仅告诉编译器保留一个仅用于单个变量的寄存器是不够的?
例如,以下GCC代码有什么问题?
#include <stdio.h>
int main()
{
    int a = 0;
    printf("Initially, a == %d.\n", a);
    /* The architecture is amd64/x86-64. */
    asm(
        "inc %[a]\n"
        : [a] "+r" (a)
        : : "cc"
    );
    printf("However, after incrementation, a == %d.\n", a);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
顺便提一下,我的内联汇编缺少输入声明,因为在我的(可能是错误的)头脑中,+r封面输入,破坏,输出,一切.我有什么误会,拜托?
背景
我已经在汇编中编写了8位和16位微控制器,但在托管环境中编码汇编方面几乎没有经验.
关于名字中的下划线的问题在这里得到了部分回答,但要么答案不完整,要么我不完全理解.
教派.C++ 11标准的2.14.8.7声明此文字运算符为例:
long double operator "" _w(long double);
Run Code Online (Sandbox Code Playgroud)
除了声明操作符之外,标准及其示例还做了两件事,如果单独查看,每件事都有意义:
_w下划线开头; 和我的问题有两个部分:
_w不是标识符,或者标识符_w不是名称,或者......好吧,我很困惑._w可以,那么大写也_W没关系 - 就像在60.0_W,意味着60.0瓦?  或者预处理器是否可能错误处理大写版本?毫无疑问,和你一样,我不习惯用下划线开始全球名字,这是习惯的标准.17.6.4.3.2.1显然似乎弃用了.因此,如果您可以在下划线,名称和文字操作符的问题上投射一些额外的亮点,那么光将会受到赞赏.
autoC++ 11 的类型很方便,所以现在也想要一个const_auto类型.例如,假设std::list<T> a;,如果
auto p = a.begin();
Run Code Online (Sandbox Code Playgroud)
有类型std::list<T>::iterator,然后有人希望
const_auto p = a.begin();
Run Code Online (Sandbox Code Playgroud)
有类型std::list<T>::const_iterator.不幸的是,C++ 11似乎没有听说过const_auto.因此,如何才能以良好的风格达到理想的效果呢?
(有关信息,请在此处提出并回答相关问题.)
在C++中,可以const &改变的价值吗?
好吧,当然不能改变,可以吗?这const意味着什么.而且,听听Stroustrup:
甲
const左值参考指的是恒定的,这是从视角的参照的用户的点不可变的.
但是这个怎么样?
#include <iostream>
int main() {
    int           a = 0;
    const int&    r = a;
    const int old_r = r;
    ++a;
    const int new_r = r;
    std::cout
      <<      "old_r == " << old_r
      << " but new_r == " << new_r << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
在我的机器上,这输出,old_r == 0 but new_r == 1.
这是我真正的问题.在上面的代码中,查看该行
    const int new_r = r;
Run Code Online (Sandbox Code Playgroud)
只要
&new_r既不在此行也不在代码的其他地方提取volatile,没有任何东西阻止优化编译器从合并old_r …
C ++ 17标准提到了一个独特的可变参数函数模板,
喜欢f<200, 50, 6>() == 256。
我认为,这很奇怪,让我看看是否可以自己编写代码。我的代码很优雅。但是,我的优雅代码无法编译,因此在两个徒劳的小时之后,我编写了以下丑陋的代码:
#include <iostream>
namespace {
    template<int A> constexpr int f() {return A;}
    template<int A, int B, int... C> constexpr int f() {
        if (sizeof...(C)) return A + f<B, C...>();
        else return A + B;
    }
}
int main() {
    int n = f<200, 50, 6>();
    std::cout << n << "\n";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
这段丑陋的代码有效,而且很有趣,因为它偶然地教会了我sizeof...()。但是,这不可能是正确的吗?
每次我尝试更简单的操作时,编译器都会大惊小怪,抱怨名称查找冲突或模板重新定义或其他类似的情况。
我的概念感觉不对。我怀疑我错过了重点。请问我错过了哪一点?
参考
有关信息,在标准(此处为草稿)中,引起我问题的部分是本节。5.13.8(第3和第4段)。但是据我所知,这种挑衅是偶然的。我的问题不是关于这样的标准。我的问题是关于适当地,优雅地使用变异函数。
非编译示例
如果您想要我更优雅,更未经编译的代码的示例,请参见以下示例:
namespace {
    template<> constexpr …Run Code Online (Sandbox Code Playgroud) grep -F "$name" -A1000 filename | sed -n '1p;19p;24p'
Run Code Online (Sandbox Code Playgroud)
假设let a=10,b=20,c=30.在上面的grep命令中我可以用'$ap;$bp;$cp'而不是'1p;19p;24p'?
另一件事,我已经给了-A1000.这意味着从1p开始考虑直到1000线,对吧?我需要在整个文件中搜索而不给出数字.
在不依赖的情况下const_cast,如何const 在之后而不是期间创建一个 C++ 数据成员,当计算多个数据成员需要一个计算成本高昂的中间值时,
下面的最小、完整、可验证的示例进一步解释了这个问题及其原因。为了避免浪费您的时间,我建议您首先阅读示例的两条注释。
\n#include <iostream>\n\nnamespace {\n\n    constexpr int initializer {3};\n    constexpr int ka {10};\n    constexpr int kb {25};\n\n    class T {\n    private:\n        int value;\n        const int a_;\n        const int b_;\n    public:\n        T(int n);\n        inline int operator()() const { return value; }\n        inline int a() const { return a_; }\n        inline int b() const { return b_; }\n        int &operator--();\n    };\n\n    T::T(const int n): value {n - 1}, a_ {0}, b_ {0}\n    {\n …Run Code Online (Sandbox Code Playgroud)