小编Ben*_*uch的帖子

if constexpr 中的 not-constexpr 变量——clang 与 GCC

struct A{
    constexpr operator bool()const{ return true; }
};

int main(){
    auto f = [](auto v){ if constexpr(v){} };
    A a;
    f(a);
}
Run Code Online (Sandbox Code Playgroud)

clang 6 接受代码,GCC 8 拒绝它:

$ g++ -std=c++17 main.cpp
main.cpp: In lambda function:
main.cpp:6:37: error: 'v' is not a constant expression
  auto f = [](auto v){ if constexpr(v){} };
                                     ^
Run Code Online (Sandbox Code Playgroud)

谁是正确的,为什么?

当我根据每个引用获取参数时,都拒绝代码:

struct A{
    constexpr operator bool()const{ return true; }
};

int main(){
    auto f = [](auto& v){ if constexpr(v){} };
    constexpr A a;
    f(a);
}
Run Code Online (Sandbox Code Playgroud)

用clang …

c++ language-lawyer constexpr c++17 if-constexpr

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

SpringBoot 2 + Junit5:带有@Value的null

我有一个带有 SpringBoot2 和 Junit5 的应用程序,现在我正在尝试进行测试。我有一个名为 OrderService 的类,如下所示:

@Component
public class OrderService {
@Value("#{'${food.requires.box}'.split(',')}")
private List<String> foodRequiresBox;

@Value("#{'${properties.prioritization}'.split(',')}")
private List<String> prioritizationProperties;

@Value("${further.distance}")
private Integer slotMeterRange;

@Value("${slot.meters.long}")
private Double slotMetersLong;
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,该类有许多 @Value 注释,用于从 application.properties 文件中提取值。

在 POM 文件中,我有以下依赖项:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
</parent>
<dependencies>
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>5.1.0</version>
</dependency>
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>RELEASE</version>
</dependency>
<dependency>
    <groupId>org.junit.platform</groupId>
    <artifactId>junit-platform-launcher</artifactId>
    <version>1.1.0</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
    <version>2.0.5.RELEASE</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

test/resources文件夹中,我有包含以下信息的 application.properties 文件:

properties.prioritization:vip,food
food.requires.box:pizza,cake,flamingo
further.distance:2
slot.meters.long:0.5
Run Code Online (Sandbox Code Playgroud)

测试文件如下所示:

properties.prioritization:vip,food
food.requires.box:pizza,cake,flamingo
further.distance:2
slot.meters.long:0.5
Run Code Online (Sandbox Code Playgroud)

但测试在尝试使用foodRequiresBox时会抛出 …

junit spring-boot junit5 spring-boot-test

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

将 CRLF(回车、换行)连接到 std::string 的规则

下面的代码输出

rm-data;
Content-Disposition: form-data;
Run Code Online (Sandbox Code Playgroud)

https://godbolt.org/z/h5z89qv6f

#include <iostream>
#include <string>

int main()
{
    std::string a = "Content-Disposition: form-data;" + '\r' + '\n';
    std::cout << a << std::endl;

    std::string b = "Content-Disposition: " + std::string("form-data;") + '\r' + '\n';
    std::cout << b << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我期望a有一个 CRLF 连接,但看起来它通过添加\r (13) + \n (10) = 23文本内起始偏移量的 ASCII 值来进行指针算术。

但是,对于b,CRLF 已正确连接。

也许更好的方法是

std::string a = "Content-Disposition: form-data;" + std::string("\r\n");
Run Code Online (Sandbox Code Playgroud)

或者

std::string a = "Content-Disposition: form-data;\r\n";
Run Code Online (Sandbox Code Playgroud)

问题

CRLF 之前的数据类型是否决定串联规则?

c++ stdstring string-literals

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

函数调用中的堆栈分配

当您调用函数时,如果传递给函数的参数不是数组,或者不是有意使用与符号 ( ) 进行引用传递,则这些参数将按值传递&。例如,

void boo (int a, int b) {}

int main() {
    int var1 {1};
    int var2 {2};

    boo(var1,var2);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,整型变量var1和的值var2被复制到函数参数a和 ,b并存储在为函数分配的堆栈帧中boo()。我的问题是:

如果我写

void boo (int a, int b) {}

int main() {
    boo(1,2);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

是整数文字1并且2不存储在main()堆栈帧中,因为它们现在是右值?

如果我改为写

void boo (int &a, int &b) {}

int main() {
    int var1{1};
    int var2{2};

    boo(var1,var2);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

是参数 …

c++ pass-by-reference pass-by-value

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

我可以在 C++20 项目中使用 std::generator 来生成范围视图吗?

C++23 引入了范围视图std::generator,用作协程的返回。根据以前的观点,通常很难生成复杂的数据序列。我认为使用协程可以大大简化这一过程。

不幸的std::generator是,目前没有任何标准库实现,并且在许多项目中,C++20 将在一段时间内保持标准。std::generator有没有办法在C++20项目中使用?

c++ c++20 c++-coroutine std-ranges c++23

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

将 QStringView 转换为 std::string 最有效的方法是什么?

我有一个函数,它的参数为QStringView. 除此之外,这必须转换为std::string. 有这个QString功能。toStdString()有没有办法避免潜在昂贵的中间步骤 via QString

c++ qt stdstring c++20 qt6

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

main() 参数 argc 可以小于 1 吗?

cppreference.com上我找到了以下代码示例:

#include <iostream>
#include <string_view>
 
// Print a string surrounded by single quotes, its
// length and whether it is considered empty.
void check_string(std::string_view ref)
{
    std::cout << std::boolalpha
              << "'" << ref << "' has " << ref.size()
              << " character(s); emptiness: " << ref.empty() << '\n';
}
 
int main(int argc, char **argv)
{
    // An empty string
    check_string("");
 
    // Almost always not empty: argv[0]
    if (argc > 0) // <--- is this necessary?
        check_string(argv[0]);
}
Run Code Online (Sandbox Code Playgroud)

argc …

c++

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

为什么我的比较器功能不起作用?

我有一个元素为 的数组[0, 1, 0, 3, 12]。我想将所有零移到它的末尾,同时保持非零元素的相对顺序。移动后的数组应该如下所示[1, 3, 12, 0, 0]。为此,我编写了以下代码:

#include <bits/stdc++.h>

using namespace std;

bool cmp(int a, int b){
    if (a == 0) {
        return a > b;
    } else {
        return true;
    }
}

int main(){
    int arr[] = {0, 1, 0, 3, 12};
    sort(arr, arr + 5, cmp);
    for (int i: arr) {
        cout << i;
    }
}
Run Code Online (Sandbox Code Playgroud)

我编写这段代码时认为,只要false在非零元素之前放置零,i就可以交换元素,但此代码给出的输出是,即[12, 3, 1, 0, 0]它只是按降序对元素进行排序。谁能解释一下为什么我的比较器功能不起作用?我可以使用比较器功能来做到这一点吗?

c++ sorting algorithm comparator

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

具有大元素的向量

假设我们的 中存储了 100 万个元素std::vector<T>,它的容量已满。现在我只想在其中添加 1 个元素。根据向量的概念,现在向量的容量将在堆中的新内存中增加一倍,并且所有 100 万个元素将被复制到新的内存位置。这似乎是一项艰巨的任务。有什么方法可以避免这种复制并仅在下一个位置添加这个新元素吗?

没有什么。我想不出有什么方法可以避免。大多数开发人员建议我使用另一个容器。

c++ containers memory-management stl vector

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

我需要在`std::unique_ptr`删除器中使用`__stdcall`吗?

我想通过以下方式管理 WinAPI 函数对std::unique_ptr

#include <memory>

int* __stdcall construct(){ return new int{5}; }
void __stdcall destruct(int* v){ delete v; }

int main() {
    using Ptr = std::unique_ptr<int, void(&)(int*)>;
    Ptr v(construct(), destruct);
}
Run Code Online (Sandbox Code Playgroud)

当我使用 MSVC 19.33 构建 64 位二进制文​​件时,代码可以正常工作。如果我构建 32 位二进制文​​件,则会出现错误。

example.cpp
<source>(8): error C2660: 'std::unique_ptr<int,void (__cdecl &)(int *)>::unique_ptr': function does not take 2 arguments
C:/data/msvc/14.33.31631/include\memory(3291): note: see declaration of 'std::unique_ptr<int,void (__cdecl &)(int *)>::unique_ptr'
Compiler returned: 2
Run Code Online (Sandbox Code Playgroud)

__stdcall如果我明确命名in ,它适用于两者std::unique_ptr<int, void(__stdcall&)(int*)>,所以我假设它是函数签名的一部分。

为什么 32 位和 64 位会有这种差异?这是编译器中的错误吗?

c++ winapi stdcall unique-ptr visual-c++

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

如果我可以访问单个字符,为什么我的字符串为空?

我是 C++ 新手,最近通过 u-demy 讲座学习了指针和参考资料。讲座结束后,我正在解决使用单独的函数反转字符串的问题。我想出了一个代码,但由于某种原因,我可以使用 [] 表示法访问单个字符(就像reverse[0]等于!)但是当我打印整个字符串时,我得到一个空字符串?是什么导致了这个问题?

提前感谢您的宝贵时间!

这里我粘贴了我的代码:

#include <iostream>
// using namespace std;

std::string reverse_string(const std::string &str) {
    std::string reversed;

    size_t size {str.length()};
    for(int i{}; i < size/2; i++) {
        reversed[i] = str[(size-1)-i];
        reversed[(size-1)-i] = str[i];
    }
    
    return reversed;
}

int main() {
    // Write C++ code here
    std::string input = "Hello, World!";
    std::string reversed = reverse_string(input);
    std::cout << reversed << std::endl;  //I get nothing, BUT
    std::cout << reversed[0] << std::endl //here I do get a …
Run Code Online (Sandbox Code Playgroud)

c++ stdstring

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

无法安装詹金斯

警告:/var/cache/yum/x86_64/7/jenkins/packages/jenkins-2.387.2-1.1.noarch.rpm:标头 V4 RSA/SHA512 签名,密钥 ID ef5975ca:NOKEY

我正在使用 vagrant 和 virtual-box for centos VM 我使用下面的命令来安装 jenkins

yum update -y
curl --silent --location http://pkg.jenkins-ci.org/redhat-stable/jenkins.repo | sudo tee /etc/yum.repos.d/jenkins.repo
sudo rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
yum install java-11* -y
yum install jenkins -y
Run Code Online (Sandbox Code Playgroud)

virtualbox centos jenkins vagrant

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