小编led*_*ter的帖子

为什么inject-class-name有时不被视为类模板中的模板名称?

资源

在以下情况中,inject-class-name被视为类模板本身的模板名称:

  • 接下来是<
  • 它用作与模板模板参数对应的模板参数
  • 它是友元类模板声明的详细类说明符中的最终标识符.

所以我试图检查所有3个案例(另外在基础模糊的背景下,虽然我认为这不应该在这里).

第一种情况似乎很简单.

问题是 - 为什么没有注释出实例?他们不在GCC和Clang上,所以我不认为这是一个实施问题

template <template <class> class> struct A;

template <class T> struct Base {};

template <class T> struct Derived: Base<int>, Base<char>
{
    // #1
    typename Derived::Base<double> d;

    // #2

    // using a = A<Base>;

    using a = A<Derived::template Base>;

    // #3

    template<class U1>
    friend struct Base;

    // template<class U>
    // friend struct Derived::template Base;
};
Run Code Online (Sandbox Code Playgroud)

以上规则仅适用于模板本身,而不适用于基础吗?如果是这样,基数的规则是什么,特别是对于最后两个案例?

c++ templates c++14 injected-class-name c++17

6
推荐指数
1
解决办法
138
查看次数

C++中变量的修改顺序是如何定义的?

我读过这个问答:与“(简单)发生在之前”相比,“强烈发生在之前”的意义是什么?

作者给出了一个有趣的评估的概述,该评估在 C++20 之前是不可能的,但显然从 C++20 开始是可能的:

.-- T3 y.store(3, seq_cst);                   --.                 (2)
|        |                                      | strongly
|        | sequenced before                     | happens
|        V                                      | before
|   T3 a = x.load(seq_cst); // a = 0    --.   <-'                 (3)
|                                         : coherence-
|                                         : ordered
|                                         : before
|   T1 x.store(1, seq_cst);             <-'   --. --.             (4)
|        |                                      |st |
|        | sequenced before                     |h  |
|        V                                      |b  |
| . T1 y.store(1, release);                   <-'   |             (x)
| | …
Run Code Online (Sandbox Code Playgroud)

c++ memory-model stdatomic c++20

5
推荐指数
1
解决办法
453
查看次数

xvalue上的下标表达式的值类别

从5.2.1.1开始:

表达式E1[E2](根据定义)与*((E1)+(E2))[...]相同,除了在数组操作数的情况下,如果该操作数是左值,则结果为左值,否则为x值.

但是,使用以下代码:

struct S
{
    int arr[5];
};

int main()
{
    int &&r = S().arr[0];
}
Run Code Online (Sandbox Code Playgroud)

GCC和Clang都抱怨"rvalue引用不能绑定到lvalue int".

我误解了什么?据我所理解的S()是rvalue,S().arr是xvalue,所以也S().arr[0]应该是xvalue,并且应该能够绑定到rvalue refs.

c++ rvalue-reference language-lawyer xvalue c++14

3
推荐指数
1
解决办法
118
查看次数

CMake导入库rpath

我有一个库,并且我通过(库已设置)IMPORTED SHARED与其链接。target_link_librariesIMPORTED_LOCATION

但是在输出中安装后ldd我看到类似的内容:

path/on-dev-machine/to/libxxx.so => not found

而不是仅仅

libxxx.so => path/on-testing-machine/to/libxxx.so

为什么会这样/我该如何解决?我正在添加 lib 路径/etc/ld.so.conf.d

示例代码:

include(GNUInstallDirs)

function(add_and_install_lib lib_name location external_dep)
    if(${location} MATCHES ".*\\.so")
        add_library(${lib_name} SHARED IMPORTED) # MODULE treated as shared
    else()
        add_library(${lib_name} STATIC IMPORTED)
    endif()

    set_property(TARGET ${lib_name} PROPERTY IMPORTED_LOCATION ${location})

    add_dependencies(${lib_name} ${external_dep})
endfunction()


set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_LIBDIR}") # this doesn't seem to help
Run Code Online (Sandbox Code Playgroud)

cmake shared-libraries ld

3
推荐指数
1
解决办法
2226
查看次数

在命名成员函数重载决策期间,'this'何时不在范围内?

cppreference:

调用命名函数

<...>如果表达式E是主表达式,则按照函数调用的正常规则(可能涉及ADL)查找名称.此查找找到的函数声明(由于查找的工作方式):<...>

b)某些类T的所有成员函数,在这种情况下,如果它在范围内并且引用T,则*将其用作隐含对象参数.否则(如果它不在范围内或者不指向T),则使用类型为T的伪对象作为隐含对象参数,如果重载决策随后选择非静态成员函数,则程序格式错误.

似乎第二种情况是关于func(arg)方法内部的调用.何时可能this不在此类案件的范围内?

或者它不只是谈论func(arg)方法中的类似东西?

c++ overloading overload-resolution c++14

3
推荐指数
1
解决办法
96
查看次数

x86 上是否有自动 L1i 缓存预取?

我查看了关于分支目标预测器的维基文章;这有点令人困惑:

我认为当 CPU 决定下一步要获取哪些指令(进入 CPU 管道来执行)时,分支目标预测器就会发挥作用。

但这篇文章提到了这样的一些观点:

指令缓存获取指令块

扫描块中的指令以识别分支

那么,指令缓存(==我想象的 L1i)是否基于某些分支目标预测数据(预)取指令?...

或者只是这篇文章暗示了x86以外的东西......好吧,或者我误解了一些东西

x86 cpu-architecture branch-prediction

3
推荐指数
1
解决办法
412
查看次数

Go中方法的范围是什么?

从规范('声明和范围'):

表示在顶层(在任何函数之外)声明的常量,类型,变量或函数(但不是方法)的标识符的范围是包块.

我想这意味着标识符的范围表示方法而不是包块.

那这是什么?我没有设法在规范中找到任何信息.

methods scope go

2
推荐指数
1
解决办法
450
查看次数

将uint8_t转换为signed int至少有时是不正确的吗?

在阅读以下问题的答案时

以十六进制表示形式获取缓冲区到字符串流:

我不明白为什么有要投uint8_tunsigned(或写在评论,甚至unsigned char在这之前),而铸造只是int不正确.

据我所知,没有任何转换会导致解释uint8_t成为一种基础类型,它可以(必须)成为3种char变体中的一些,从而将其作为一个字符打印出来.

但是施法有什么不对int?任何uint8_t值都应该始终适合int,因此转换似乎很简单.为什么sign-extension会使代码不正确(在评论中提到)?

UPD:

仅供参考,我想在我提到的问题中谈到的是一个案例signed char:

signed char num = -1;
std::cout << std::hex << static_cast<unsigned int>(static_cast<unsigned char>(num));
Run Code Online (Sandbox Code Playgroud)

如果f没有第二次演员,这将写成超过2 秒.

关于2的补码系统的观点似乎是不正确的,因为积分转换应该适用于将-1转换为unsigned <smth>,并且它遵循2的补数系统(即,当转换为例如uint8_t结果应该始终为255并因此被打印为0xff,甚至有不同的位模式).

c++ int unsigned casting

1
推荐指数
1
解决办法
1314
查看次数