请参考以下示例代码:
void test(const Item& item = Item()) {
...
}
Run Code Online (Sandbox Code Playgroud)
假设,一旦item传递给函数,就不能抛出.
问题是:应该标记功能noexcept还是noexcept(noexcept(Item()))?
IHMO,前者应该没事,但我不确定.非常感谢标准的报价!
采取以下代码:
#include <array>
int main() {
auto [a, unused] = [] {
return std::array<int, 2>{42, 24};
}();
[&] {
return a * 15;
}();
(void) unused;
}
Run Code Online (Sandbox Code Playgroud)
不用担心unused变量,我只想对数组进行解构。
使用最新的GCC和MSVC可以很好地编译代码,但是Clang 拒绝编译。更改lambda的捕获列表不会更改任何内容。有趣的是,a在捕获列表中显式设置会引发错误a is not a variable。
我很确定这是一个错误,但是我想问一下,主要是因为AFAIK a是对数组第一个元素的引用(main在这种情况下,生存期扩展到了范围),而不仅仅是一个int,请纠正我错误。
你可以从其他的问题看,问题是,a与unused不变量(是的,锵是正确的!),但参考的名字,不能用lambda表达式被捕获。不过,如果您确实需要这样的东西,可以为lambda使用局部变量,如下所示:
#include <array>
int main() {
auto [a, unused] = [] {
return std::array<int, 2>{42, 24};
}();
[&, a = a] …Run Code Online (Sandbox Code Playgroud) 我想拍摄PGF图片,缩小它(缩放文本,所以\resizebox会很完美)以获得一定的高度,然后在图片的左侧放置一个旋转的文本并创建一个包含所有内容的节点.
像这样的东西:
但我希望能够设置图表的高度而不缩小旋转的"标题".
以下是此示例的LaTeX代码:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning,fit,shapes.geometric,backgrounds}
\begin{document}
\begin{tikzpicture}[%
inner sep=2mm,
delimiter/.style={ellipse, very thick, fill=red!30, draw=red!50},
action/.style={trapezium, trapezium left angle=120, trapezium right angle=60, thick, fill=blue!30, draw=blue!50, align=center},
loop/.style={ellipse, thick, fill=yellow!30, draw=yellow!50, align=center},
title/.style={font=\LARGE\scshape,node distance=16pt, text=black!40, inner sep=1mm},
background/.style={rectangle, rounded corners, fill=black!5, draw=black!15, inner sep=4mm}
]
\node[delimiter] (begin) {Begin};
\node[action] (cluster residues) [below=of begin] {Cluster residues};
\node[action] (set clusters) [below=of cluster residues] {Set properties\\for every cluster};
\node[action] (find pockets) [below=of set clusters] {Find clusters with\\$normalized\ SAS < 1$};
\node[action] …Run Code Online (Sandbox Code Playgroud) 请使用以下代码:
#include <array>
constexpr std::array<int, 10> a{};
static_assert(std::next(std::begin(a)) == std::begin(a) + 1);
Run Code Online (Sandbox Code Playgroud)
随着-std=c++17GCC的完美编译,但Clang抱怨表达式不是一个完整的常量表达式.看起来问题是关于std::next哪个应该是constexpr在C++ 17中.
然而,std::next在std库中,而不是在编译器本身,因此有一些奇怪的事情发生.只是为了让事情变得更好,如果你传给-stdlib=libc++Clang ,那么这个例子就完美地编译了.
到底是怎么回事?谁错了,谁是对的?
编辑
这个问题似乎与使用Godbolt内部的GCC 7.2 工具链相关.如果将--gcc-toolchain=/opt/compiler-explorer/gcc-snapshot参数添加到命令行,一切都可以正常运行.(感谢@einpoklum向godbolt报告了这个问题 - 我速度慢了;))
编辑
对于那些认为旧编译器应该适用于实际标准的人来说,遗憾的是,这种考虑是没有意义的.我在谈论GCC和Clang的最新版本.并且这个问题可以通过两者的主干版本重现.较旧的编译器与此问题无关(相反,MSVC行为会很有趣).
我遇到了模板模板和参数扣除的问题.这是代码:
template<typename U, template<typename> class T>
void test(T<U>&& t)
{
...
}
Run Code Online (Sandbox Code Playgroud)
我希望这可以接受左值和左值,但只适用于右值.折叠规则"T &&& = T&"在这种情况下不适用?
当然,我也可以声明左值引用函数,但是使代码的可读性降低.
如果你问我为什么需要这个就是使用static_assert来检查T是否是一个特定的类.如果有一种更简单的方法,我会很乐意改变我的代码,但我想知道模板模板是否可以这种方式使用.
谢谢
我需要声明一个可以存储不同类型容器的类.即如果它可以处理std :: bitset和std :: array会很好.但是,这两个类需要不同的模板参数...是否有可能(以及可能,如何)使用模板化模板类和可变参数模板来声明这种类?
示例(但错误):
template<template <typename..., std::size_t> class Container,
std::size_t N,
typename... Args>
class Base_Class
{
...
Container<Args..., N/2> container;
};
Run Code Online (Sandbox Code Playgroud)
编译器抱怨N/2不是类型.显然,对于std :: array和std :: bitset,我需要将大小作为最后一个模板参数......是否有可能编码这种疯狂?
谢谢!
编辑:就我而言,主要问题是可变参数模板只能在右侧扩展,因此可变参数必须是最后一个.任何人都知道是否有任何计划允许在C++ 17中使用以下语法?
template<typename... Args, typename T>
struct A
{};
Run Code Online (Sandbox Code Playgroud) 我想使用Concepts TS帮助我进行数据约束.我将讨论p0121r0中讨论的概念,我正在使用GCC 6.2进行测试.
拿这段简单的代码:
template<typename T>
concept bool test_is_available = requires(T t) {
t.test;
{ t.test++ };
{ t.test-- };
};
template<test_is_available T>
struct Tester
{
T t;
};
Run Code Online (Sandbox Code Playgroud)
我必须向struct Tester传递一个带有test属性的类型,该属性是可递增和可递减的.好.
struct A
{
unsigned test;
}
Tester<A> a;
Run Code Online (Sandbox Code Playgroud)
按预期工作.显然,以下一个不起作用:
struct B
{
std::string test;
};
struct C
{
unsigned not_test;
};
Tester<B> b; // error: test++ and test-- are ill formed
Tester<C> c; // error: no test available
Run Code Online (Sandbox Code Playgroud)
现在,真正的问题是:为什么以下一个不起作用?
class D
{
unsigned test;
}; …Run Code Online (Sandbox Code Playgroud) 想象一下,你有这个通用的伪代码:
template<typename Iterable>
void f(Iterable&& iterable)
{
...
}
Run Code Online (Sandbox Code Playgroud)
我们想要处理对可迭代对象1的 rvalue和lvalue引用,并且想法是该函数处理容器逐元素地执行操作.
我们想要将容器的参考规范转发给元素是合理的.换句话说,如果iterable是右值引用,则该函数必须从容器中移动元素.
使用C++ 17,我会这样做
auto [begin, end] = [&] {
if constexpr(std::is_lvalue_reference_v<Iterable>)
return std::array{std::begin(iterable),
std::end(iterable)};
else
return std::array{
std::make_move_iterator(std::begin(iterable)),
std::make_move_iterator(std::end(iterable))};
}();
std::for_each(begin, end, [&](auto&& element)
{
...
});
Run Code Online (Sandbox Code Playgroud)
显然,这不是维护2的最佳代码,容易出错,并且编译器可能不那么容易优化.
我的问题是:对于未来的C++标准,有可能引入转发基于范围的循环的概念吗?如果这样会好的
for(auto&& el : std::move(iterable))
{
...
}
Run Code Online (Sandbox Code Playgroud)
可以处理el作为右值参考.通过这种方式,这将是可能的:
template<typename Iterable>
void f(Iterable&& iterable)
{
for(auto&& el : std::forward<Iterable>(iterable))
{
/*
* el is forwarded as lvalue reference if Iterable …Run Code Online (Sandbox Code Playgroud)