在以下情况中,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++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) 从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.
我有一个库,并且我通过(库已设置)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) 调用命名函数
<...>如果表达式E是主表达式,则按照函数调用的正常规则(可能涉及ADL)查找名称.此查找找到的函数声明(由于查找的工作方式):<...>
b)某些类T的所有成员函数,在这种情况下,如果它在范围内并且引用T,则*将其用作隐含对象参数.否则(如果它不在范围内或者不指向T),则使用类型为T的伪对象作为隐含对象参数,如果重载决策随后选择非静态成员函数,则程序格式错误.
似乎第二种情况是关于func(arg)方法内部的调用.何时可能this不在此类案件的范围内?
或者它不只是谈论func(arg)方法中的类似东西?
我查看了关于分支目标预测器的维基文章;这有点令人困惑:
我认为当 CPU 决定下一步要获取哪些指令(进入 CPU 管道来执行)时,分支目标预测器就会发挥作用。
但这篇文章提到了这样的一些观点:
指令缓存获取指令块
扫描块中的指令以识别分支
那么,指令缓存(==我想象的 L1i)是否基于某些分支目标预测数据(预)取指令?...
或者只是这篇文章暗示了x86以外的东西......好吧,或者我误解了一些东西
从规范('声明和范围'):
表示在顶层(在任何函数之外)声明的常量,类型,变量或函数(但不是方法)的标识符的范围是包块.
我想这意味着标识符的范围表示方法而不是包块.
那这是什么?我没有设法在规范中找到任何信息.
在阅读以下问题的答案时
我不明白为什么有要投uint8_t给unsigned(或写在评论,甚至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,甚至有不同的位模式).