3 Câu hỏi: Là chuỗi bổ sung này là một biểu thức hợp lệ?

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Tôi đã tò mò nếu các toán tử gán gán hợp lệ cho nhiều tham số. Tôi đoán là + = sẽ không có tác dụng phụ nhưng có thể không giống với trường hợp "- =".

std::string a; 
a += "Hello" + " "+"World"; // doesn't compile
std::string name = "Old";
a += "Hello" + name +"World"; // compiles
    
1
  1. Tại sao bạn không thử biên dịch nó để xác định xem nó có hợp lệ không?
    2019-05-08 15: 50: 14Z
  2. @ JesperJuhl Công bằng mà nói, không phải vì mã biên dịch rằng nó hợp lệ.
    2019-05-08 15: 50: 58Z
  3. @ FrançoisAndrieux Tất nhiên là không (như tôi biết bạn biết tôi biết). Nhưng nó sẽ cho phép OP thêm thông tin bổ sung: "nó biên dịch" hoặc "nó không biên dịch với lỗi này: ...". Và tự mình thực hiện một số thử nghiệm cơ bản (như "điều này có biên dịch được không?") Là một thói quen tốt để tham gia.
    2019-05-08 15: 53: 54Z
  4. Họ (không phải tôi) có thể nghĩ rằng bạn không làm đủ nghiên cứu trước khi đặt câu hỏi. Đó là một chút chủ quan.
    2019-05-08 18: 58: 28Z
3 Câu trả lời                              3                         

Đây không phải là biểu thức hợp lệ vì không có toán tử + cho chuỗi ký tự

"Hello" + " "+"World

(chính xác hơn cho con trỏ bởi vì trong biểu thức chuỗi ký tự có ngoại lệ hiếm được chuyển đổi thành con trỏ thành ký hiệu đầu tiên của chúng.)

Thay vào đó bạn có thể viết

std::string a; 
( ( a += "Hello" ) += " " ) += "World";

Nhưng sẽ dễ đọc hơn nếu viết

a += "Hello";
a += " ";
a += "World";

Hoặc như @Bathsheba đã chỉ ra trong một nhận xét (có giá trị) cho câu trả lời của tôi, bạn có thể sử dụng chuỗi ký tự do người dùng xác định theo cách sau

#include <string>
#include <iostream>

int main()
{
    using namespace std::string_literals;
    std::string a; 
    a += "Hello"s + " " + "World";

    std::cout << a << '\n';
}

Đối với tuyên bố này

a += "Hello" + name +"World";

sau đó có thể được viết lại bằng cách sử dụng các toán tử được xác định cho lớp std::basic_string

template<class charT, class traits, class Allocator>
basic_string<charT, traits, Allocator>
operator+(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs);

template<class charT, class traits, class Allocator>
basic_string<charT, traits, Allocator>
operator+(basic_string<charT, traits, Allocator>&& lhs, const charT* rhs);

thích

a += operator +( operator +( "Hello", name ), "World" ); 

Ví dụ

#include <string>
#include <iostream>

int main()
{
    std::string a;
    std::string name = "Old";

    a += operator +( operator +( "Hello ", name ), " World" ); 

    std::cout << a << '\n';
}

Hãy tính đến việc mỗi nhà khai thác trả về một đối tượng thuộc loại std::basic_stringoperator + được xác định. Đó là trong mỗi cuộc gọi của các nhà khai thác, có một đối tượng thuộc loại std::basic_string làm đối số.

    
4
2019-05-08 16: 16: 40Z
  1. Chào mừng bạn quay lại Vlad!
    2019-05-08 15: 46: 56Z
  2. @ Bathsheba Cảm ơn. Tôi rất vui được gặp bạn. :)
    2019-05-08 15: 48: 46Z
  3. Hoặc bạn chỉ có thể viết a += "Hello" " " "World" hoặc thậm chí `` a + = "Hello World" `, nếu bạn cảm thấy phiêu lưu.
    2019-05-08 15: 49: 24Z
  4. @ DanM. Bạn đúng nhưng câu hỏi là về toán tử +.
    2019-05-08 15: 50: 00Z
  5. @ bruno: Nó có độ sâu ẩn. Lưu ý rằng nếu a += b thực sự được thay thế bằng a = a + b, thì mã sẽ được biên dịch.
    2019-05-08 15: 50: 00Z

Toán tử gán hợp chất += không đi vào nó.

Bạn có thể sử dụng += với std::string nó xác định tình trạng quá tải có liên quan , nhưng nó chỉ nhận được một đối số.

Và bạn đã cố gắng vượt qua, theo lập luận đó, một biểu thức được xây dựng bởi +ing nhiều chuỗi ký tự. Điều này sẽ không biên dịch.

Một số lựa chọn thay thế, trong trường hợp đồ chơi này, có thể truyền cảm hứng cho một giải pháp cho bất kỳ trường hợp thực tế nào của bạn:

Tùy chọn 1

// Multiple calls to +=
std::string a;
a += "Hello";
a += " ";
a += "World";

Tùy chọn 2

// String literal concatenation!
std::string a; 
a += "Hello" " " "World";

Tùy chọn 3

// Repeated std::string concat
std::string a;
a += std::string("Hello") + " " + "World";

Tùy chọn 4

// Same
using namespace std::string_literals;
std::string a; 
a += "Hello"s + " " + "World";

Tùy chọn 5

// Don't bother
std::string a;
a += "Hello World";
    
4
2019-05-08 15: 52: 53Z
  1. Tại sao ví dụ thứ hai biên dịch?
    2019-05-08 15: 56: 55Z
  2. @ ash007 Đó là một tính năng ngôn ngữ , mặc dù là một tính năng ngôn ngữ ít được biết đến.
    2019-05-08 16: 04: 26Z
  3. 2019-05-08 16: 05: 18Z
  4. Cảm ơn @Lightness ...
    2019-05-08 17: 45: 34Z

Biểu thức a += "Hello" + " " + "World" được nhóm thành a += ("Hello" + " " + "World").

Phía bên tay phải là một bộ gồm 3 const char[]. Những phân rã thành const char* con trỏ khi áp dụng cho phép cộng nhị phân. Vì bạn không thể thêm con trỏ, trình biên dịch được yêu cầu đưa ra chẩn đoán.

(Lưu ý rằng biểu thức tương đương bề ngoài a = a + "Hello" + " " + "World" có thể biên dịch được.)

    
2
2019-05-08 15: 52: 05Z
nguồn đặt đây