在我的环境中,它std::initializer_list被实现为指向第一个元素的指针和一个大小.仍然在我的具体设置中,我能够观察到:
initializer_list从函数返回by值不会更改指针的值(导致数据不会与initializer_list一起复制的结论).如果副本可以比原始对象更长initializer_list,那么复制一个是不安全的.
可移动性允许一系列优化.然而,它认为它是以牺牲程序的静态安全性为代价来实现的:
移动后,源对象处于有效但未指定的状态,其中某些操作是合法的,但有些操作是合法的.(特别是关于这个主题的讨论,请参阅这个SO问题).看起来这个操作列表,即使它依赖于每种类型,也可以在编译时知道.然而,编译器并没有警告移动对象的错误使用(正如其他SO问题所讨论的那样).
感觉就像C++哲学一样,依靠编译器尽可能多地验证(静态知道的),其中一个例子是const-correctness enforcing.然而,似乎移动对象可以以危险的方式使用,而编译器不会尝试(或有任何意义)来捕获它们.
实际上是否存在允许编译器更好诊断的机制?如果没有,为什么没有新的限定符应用于可以在移动的对象上使用的方法,或者是否允许等效静态验证的其他机制?
这是一个行话问题.在C++中有几个伞形术语可以对逻辑运算进行分组.例如:
是否所有构造函数都有一个术语可以创建一个对象而无需复制或移动同一个类的另一个对象?
我们将路径表示为boost::filesystem::path,但在某些情况下,其他API期望它们const char *(例如,使用SQLite打开DB文件).
从文档中,path::value_type是一个wchar_tWindows下.据我所知,Windows wchar_t是2字节,UTF-16编码.
有一个string()原生观察者返回一个std::string,同时说明:
如果string_type是与String不同的类型,则转换由cvt执行.
cvt被初始化为默认构造codecvt.这个默认构造的codecvt的行为是什么?
有这个论坛条目,建议使用一个实例utf8_codecvt_facet作为cvt值可移植转换为UTF-8.但似乎这个codecvt实际上是在UTF-8和UCS-4之间转换,而不是UTF-16.
什么是最好的方式(如果可能的话,便携式)获得a的std::string表示path,确保wchar_t在必要时从正确的编码转换?
我们使用Pipeline Shared Libraries插件来分解我们不同的Jenkins 管道共有的代码.
从其文档中,它resources为非Groovy文件提供了顶级文件夹.由于我们依赖于不同的bash函数,我们希望将它们托管在一个单独的.sh文件中(因此它们也可以被除Jenkins之外的其他进程使用).相同的文档告诉我们使用libraryResource步骤加载这些资源文件.我们可以在Groovy脚本中成功调用此方法,并将其资源文件名称作为argument(function.sh).但是从这里开始,我们无法找到一种方法来调用同一个Groovy脚本中foofoo定义的函数function.sh.
sh "foofoo" #error: foofoo is not defined
Run Code Online (Sandbox Code Playgroud)
我们也试图像这样首先采购它:
sh "source function.sh && foofoo"
Run Code Online (Sandbox Code Playgroud)
但它在source步骤失败,说明function.sh找不到.
调用中定义的bash函数的正确过程是什么? function.sh
这个问题可能很难在标题中的句子中描述,但这是一个最小的示例:
#include <iostream>
#include <type_traits>
template <class T, class U, class Enabler>
struct my_trait : std::false_type
{};
template <class T, class U>
struct my_trait<T, U,
std::enable_if_t<std::is_same<T, U>::value>> : std::true_type
{};
template <class T>
class temped
{};
template <class T>
struct my_trait<temped<T>, temped<T>, void> : std::false_type
{};
template <class T, class U>
using trait_t = my_trait<T, U, void>;
int main()
{
std::cout << std::boolalpha;
std::cout << trait_t<int, float>::value << std::endl; // false
std::cout << trait_t<int, int>::value << std::endl; // true
// …Run Code Online (Sandbox Code Playgroud) 我们有一个使用 Azure Pipeline 的项目,依赖于azure-pipelines.yml存储库根目录中的文件。
实现一个script步骤时,可以在同一步骤中执行连续的命令,只需将它们写在不同的行上即可:
- script: |
ls -la
pwd
echo $VALUE
Run Code Online (Sandbox Code Playgroud)
然而,如果我们有一个很长的命令,我们希望能够在 YAML 文件中将其分成几行,但却找不到相应的语法?
想象一下,我们有这样的模型:
class Container(models.Model):
name = models.CharField(max_length=60)
class Element(models.Model):
container = models.ForeignKey(Container, blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)
Container是一个,Element是很多.
在Django管理,如果我添加一个StackedInline与model=Element该inlines对的Container型号联系:
class Inline(admin.StackedInline):
model = Element
class ContainerAdmin(admin.ModelAdmin):
inlines = (Inline,)
admin.site.register(Container, ContainerAdmin)
Run Code Online (Sandbox Code Playgroud)
我最终得到一个formset,允许我在Add Container表单中输入新 Element对象.
相反,我希望获得一个选择小部件,以选择现有的对象.
Element
没有引入额外的模型,这可能吗?
我们在代码库中发现了令人惊讶的行为,其中友谊关系未能应用.(目前仅与Clang编译,版本3.6)
我们可以将它减少到这个最小的例子.我们假设我们有以下模板类定义:
template <int>
class Element
{};
// Forward declaration of FriendBis
template <template <int> class> class FriendBis;
class Details
{
friend class FriendBis<Element>;
int mValue = 41;
};
template <template <int> class>
class FriendBis
{
public:
void useDetails(const Details &aDetails)
{
aDetails.mValue;
}
};
Run Code Online (Sandbox Code Playgroud)
在这里,Details声明FriendBis用其单个模板模板参数替换的实例化Element是它的friend.因此,以下客户端代码成功编译:
FriendBis<Element> fb1;
fb1.useDetails(Details());
Run Code Online (Sandbox Code Playgroud)
现在,让我们介绍一个额外的trait模板化类型,其目的是定义proto模板的模板别名Element:
struct trait
{
template <int N>
using proto = Element<N>;
};
Run Code Online (Sandbox Code Playgroud)
下面的客户端代码无法编译:
FriendBis<trait::proto> fb2;
fb2.useDetails(Details()); …Run Code Online (Sandbox Code Playgroud) 我们正在将 CI 基础设施实现为 Docker 堆栈。
堆栈中的一些容器现在需要访问外部服务,只能通过 OpenVPN 连接使用,比如说在192.168.2.0/24子网上。
为了尽可能保持容器的“单一用途”,我们最好添加一个 Docker 容器作为 VPN 网关,其他容器可以通过它与192.168.2.0/24子网通信。
这首先带来了一个复杂性:VPN 客户端容器需要cap-addof NET_ADMIN,这在我们用于部署堆栈的 swarm 模式中不可用。是否有解决方法,从单独启动 VPN 客户端容器到docker run?
更重要的是,一旦我们vpnclient运行并连接了容器,我们如何配置 swarm 中的其他容器以实际将其用作网关以访问192.168.2.0/24子网上的所有 IP ?