我可以使用github /compare
显示HEAD中两个不同源文件之间的区别吗?
以下是我在命令行中执行此操作的方法git diff
:
git diff HEAD:docs/tutorial/01-boxed-function-pointers.cpp HEAD:docs/tutorial/02-raw-actors.cpp
我对github语法的最佳猜测如下.但它不起作用:
我特别想要一个在线漂亮打印的差异HTML渲染.
如果用github无法做到这一点,那么任何人都可以推荐第三方网站来渲染github上托管的两个任意文件的差异吗?
感谢您推荐https://www.diffchecker.com的答案.但是,我需要能够将源文件指定为github上的当前HEAD.任何第三方工具都需要从github repo URL自动提取最新的源文件.我注意到http://www.mergely.com可以从URL 导入源.但是我正在寻找一直使用最新HEAD的实时视图.
谢谢.
给定POD结构(在C++ 03中)或标准布局类型(在C++ 11中),所有成员都具有基本对齐要求,是否保证每个成员根据其对齐要求进行对齐?
换句话说,对于m_k
{ m0
... mn
}标准布局类型的所有成员S
,
struct S {
T0 m0;
T1 m1;
...
TN mn;
};
Run Code Online (Sandbox Code Playgroud)
是否保证评估以下表达式true
?
(offsetof(S,m_k) % alignof(decltype(S::m_k))) == 0
Run Code Online (Sandbox Code Playgroud)
请给出C++ 03和C++ 11的答案,并引用标准的相关部分.支持C标准的证据也会有所帮助.
我对C++ 03标准(ISO/IEC 14882:2003(E))的阅读是关于POD结构中成员的对齐,除了第一个成员之外,它是静默的.相关段落是:
在规范的语言中,对象是"存储区域":
1.8 C + +对象模型[intro.object]
1.8/1 C++程序中的构造创建,销毁,引用,访问和操作对象.对象是存储区域....
根据对齐要求分配对象:
3.9类型[basic.types]
3.9/5对象类型具有对齐要求(3.9.1,3.9.2).完整对象类型的对齐是表示字节数的实现定义的整数值; 在满足其对象类型的对齐要求的地址处分配对象.
基本类型具有对齐要求:
3.9.1基本类型[basic.fundamental]
3.9.1/3对于每个有符号整数类型,存在相应的(但不同的)无符号整数类型:"unsigned char","unsigned short int","unsigned int"和"unsigned long int",每个它占用相同的存储量,并且具有与相应的有符号整数类型相同的对齐要求(3.9) ; ...
由于"实现对齐要求",可能会发生填充:
9.2班级成员[class.mem]
9.2/12声明没有插入访问说明符的(非联合)类的非静态数据成员,以便后面的成员在类对象中具有更高的地址.由访问说明符分隔的非静态数据成员的分配顺序未指定(11.1).实现对齐要求可能导致两个相邻成员不会立即分配 ; 因此,可能需要空间来管理虚拟功能(10.3)和虚拟基类(10.1).
9.2/12中的"已分配"一词与3.9/5中的"已分配"含义相同吗?规范中"分配"的大多数用法是指动态存储分配,而不是结构内部布局.使用可能在9.2/12中似乎意味着结构成员可能不严格要求3.9/5和3.9.1/3的对齐要求.
POD结构的第一个成员将根据结构的对齐要求进行对齐:
9.2/17指向POD结构对象的指针,使用reinterpret_cast进行适当转换,指向其初始成员(或者如果该成员是位字段,则指向它所在的单位),反之亦然.[ 注意:因此,在POD-struct对象中可能存在未命名的填充,但不是在其开头,以实现适当的对齐.]
[重点在上述所有引文中加入.]
C++20 是否允许衰减为函数指针的非捕获 lambda 直接作为非类型模板参数传递?如果是这样,正确的语法是什么?
我已经在各种版本的 clang 和 gcc 中使用-std=c++2a
.
#include <iostream>
template<auto f>
struct S {
static void invoke(int x) { f(x); }
};
using X = S<+[](int x) -> void { std::cout << x << " hello\n"; }>;
int main()
{
X::invoke(42);
}
Run Code Online (Sandbox Code Playgroud)
gcc 毫无怨言地编译代码,代码按预期运行。
clang 编译失败并出现以下错误:
error: a lambda expression cannot appear in this context
using X = S<+[](int x) -> void { std::cout << x << " hello\n"; }>;
^
Run Code Online (Sandbox Code Playgroud)
这是完整的代码(在线版本):
Clang 10.0.0 头:https …
以下代码标准是否合规?(或者它可以在不制造x
原子的情况下使其符合要求volatile
?)
这与之前的问题类似,但是我想引用C++标准的相关部分.
我担心的是原子store()
并load()
没有为非原子变量(x
在下面的例子中)提供足够的编译器障碍来正确释放和获取语义.
我的目标是实现无锁原语,例如队列,可以在线程之间传递指向常规C++数据结构的指针.
#include <atomic>
#include <chrono>
#include <iostream>
#include <thread>
int x; // regular variable, could be a complex data structure
std::atomic<int> flag { 0 };
void writer_thread() {
x = 42;
// release value x to reader thread
flag.store(1, std::memory_order_release);
}
bool poll() {
return (flag.load(std::memory_order_acquire) == 1);
}
int main() {
x = 0;
std::thread t(writer_thread);
// "reader thread" ...
// sleep-wait is just …
Run Code Online (Sandbox Code Playgroud) 我希望以下代码失败并static_assert
检查最后一行.但是在MSVC2015和gcc 6.2中,它成功编译.它确实无法在clang 3.9中按预期编译.这是编译器错误还是static_assert
内部不起作用decltype()
?
#include <tuple>
#include <type_traits>
template<typename T>
struct Wrapper {};
template<typename T, typename U>
constexpr std::tuple<T, U> operator|(Wrapper<T>, Wrapper<U>)
{
static_assert(std::is_same<T,U>::value == false, "can't combine two of the same type");
return std::tuple<T, U> {};
}
struct A {};
struct B {};
constexpr Wrapper<A> aaa = {};
constexpr Wrapper<B> bbb = {};
constexpr auto shouldPass1 = aaa | bbb;
//constexpr auto shouldFail1 = aaa | aaa; // fails static assert as expected
using …
Run Code Online (Sandbox Code Playgroud) 我正在尝试从命令提示符访问 Visual Studio 2019 版本的 clang。我正在寻找官方的方法来做到这一点。到目前为止,它似乎没有记录在任何MSVC/clang 博客文章中。(请注意,我不是在寻找在 Windows 上构建/安装 clang 的其他方法。这个问题特别与 VS2019 clang 组件有关。)
使用 Visual Studio 安装程序,我安装了 Visual Studio 2019 Professional(版本 16.4.1)以及可选的“适用于 Windows 的 C++ Clang 工具(9.0.0 - x64/x86)”。clang 工具链似乎安装在:
C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\Llvm\bin
(也许我可以将此目录添加到 PATH,但这并不健壮。我也找不到任何 Microsoft 文档中记录的这种方法。)
我的最终目标是clang-cl
与 scons一起使用。但作为第一步,我希望能够clang-cl
从命令提示符运行。
当我运行vcvarsall.bat
时,命令提示符下没有可用的 clang 工具:
C:\Users\Ross>"C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Auxiliary\Build\vcvarsall.bat" x64
**********************************************************************
** Visual Studio 2019 Developer Command Prompt v16.4.1
** Copyright (c) 2019 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] …
Run Code Online (Sandbox Code Playgroud) 以下三个强制转换用于提取用于指针算术的原始字节指针有什么区别吗?(假设一个char为1个字节的平台.)
static_cast<char*>((void*)ptr))
reinterpret_cast<char*>(ptr)
static_cast<char*>(static_cast<void*>(ptr))
我应该选择哪个?
更详细......
给定一个类中两个成员对象的指针,我想计算从一个到另一个的偏移量,这样我就可以重建给定偏移量的一个成员的地址和另一个成员的地址.
// assumed data layout:
struct C {
// ...
A a;
// ...
B b;
}
Run Code Online (Sandbox Code Playgroud)
我目前使用的代码是:
void approach1( A *pa, B *pb )
{
// compute offset:
std::ptrdiff_t offset = static_cast<char*>((void*)pa) - static_cast<char*>((void*)pb);
// then in some other function...
// given offset and ptr to b, compute ptr to a:
A *a = static_cast<A*>( (void*)(static_cast<char*>((void*)pb) + offset) );
}
main()
{
C c;
approach1(&c.a, &c.b);
}
Run Code Online (Sandbox Code Playgroud)
我想知道以下是否更好(或更糟):
void approach2( A *pa, …
Run Code Online (Sandbox Code Playgroud) 以下程序是否符合C++ 11?如果是这样,你知道触发它的特定MSVC错误吗?和/或可能的解决方法?
#include <iostream>
struct A {};
struct B {};
constexpr A aaa = {};
constexpr B bbb = {};
template <typename T>
void foo(T, decltype(aaa)) { std::cout << "a"; }
template <typename T>
void foo(T, decltype(bbb)) { std::cout << "b"; }
// ^ C2995 'void foo(T,unknown-type)': function template has already been defined
int main()
{
foo(0, aaa);
foo(0, bbb);
}
Run Code Online (Sandbox Code Playgroud)
如果替换实际类型decltype
然后它可以工作,但实际上这些类型太复杂而不能重现,我宁愿不为它们添加别名.
我的目标是实现一个谓词,该谓词检测嵌套using
别名(或typedef
)的存在,该别名充当轻量级标签以指示类具有某些属性(用于通用编程).例如,has_my_tag<T>
谓词的行为应如下所示:
struct A {
using my_tag = void;
};
struct B {};
int main()
{
static_assert(has_my_tag<A>::value, ""); // evaluate to true if my_tag=void is present
static_assert(!has_my_tag<B>::value, ""); // false otherwise
}
Run Code Online (Sandbox Code Playgroud)
用户@JoelFalcou将此称为"轻量级分类习惯用法",并在此答案中提供了解决方案.我一直无法找到任何关于该名称的成语的引用(你知道吗?)这是Joel的实现has_my_tag<>
:
template<class T, class R = void>
struct enable_if_type { typedef R type; };
template<class T, class Enable = void>
struct has_my_tag : std::false_type {};
template<class T>
struct has_my_tag<T, typename enable_if_type<typename T::my_tag>::type> :
std::true_type
{};
Run Code Online (Sandbox Code Playgroud)
这是Compiler Explorer上的一个工作版本:https: …
I would like to use tag dispatch to implement a kind of "mode select" parameter to select among multiple implementations of a function. This is easy when there is only one function, and one axis of variation. However, I would like to implement something more flexible supporting:
operator|
to combine one mode from each axisI will give a working example below. …
是否有任何C++标准保证STL迭代器可以存储在一个联合中?如果是这样,哪个标准?
例如:
union MyUnion {
std::vector<int>::iterator iter;
size_t size;
};
Run Code Online (Sandbox Code Playgroud)
我问的原因是我正在移植其他人在代码中存储std::vector
和std::map
迭代的代码,而MSVC2013似乎并不喜欢它.我收到错误C2621:非法工会成员; type ...有一个复制构造函数.我想确定这是代码中的错误,MS STL实现中的错误,还是编译器中的错误.
非常感谢!
是否可以创建一个模板来推断枚举类值模板参数的基础枚举类类型?我想做类似以下非工作伪示例的事情:
enum class MyEnumClass { e1, e2, e3 };
template<enum class T X> MyTemplate { // wrong syntax. want to specify X, infer T
using enum_class_type = T;
static constexpr enum_class_type value = X;
};
Run Code Online (Sandbox Code Playgroud)
我希望仅使用一个参数即可实例化,例如MyTemplate<MyEnumClass::e1>
:
static_assert( std::is_same<MyTemplate<MyEnumClass::e1>::enum_class_type, MyEnumClass>::value );
static_assert( MyTemplate<MyEnumClass::e2>::value == MyEnumClass::e2 );
Run Code Online (Sandbox Code Playgroud)
我知道以下方法有效,但它要求我显式指定枚举类类型作为第二个模板参数:
template<typename EnumClass, EnumClass X>
struct EnumValue {
using enum_class_type = EnumClass;
static constexpr enum_class_type value = X;
};
// usage: EnumValue<MyEnumClass, MyEnumClass::e1>::enum_class_type
Run Code Online (Sandbox Code Playgroud)