Với mã nguồn sau đây:trình biên dịch nào có lỗi, theo tiêu chuẩn?
#include <memory>
#include <iostream>
using namespace std;
struct concept
{
virtual void perform() = 0;
};
struct model : concept, enable_shared_from_this<model>
{
void perform() override {
cout << "my pointer is " << shared_from_this().get() << endl;
}
};
int main(int argc, const char * argv[])
{
// shared_ptr<concept> concept_ptr = make_shared<model>();
shared_ptr<concept> concept_ptr { new model };
concept_ptr->perform();
return 0;
}
Biên soạn dưới gcc
, mã này biên dịch và liên kết nội bộ weak_ptr
với địa chỉ của model
.
Dưới clang
mã sẽ không biên dịch (thông báo lỗi bao gồm ở cuối)
Nếu bạn thay thế khởi động của concept_ptr
với shared_ptr<concept> concept_ptr = make_shared<model>();
nó sẽ biên dịch trên cả hai.
Điều gì là chính xác?
chỉnh sửa:
phiên bản của tôi về kêu vang là một trong những mà tàu với Xcode
:
$ clang --version
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
Target: x86_64-apple-darwin13.3.0
Thread model: posix
edit2:
Chỉ muốn nói lời cảm ơn đến tất cả mọi người đóng góp. Nếu bạn quan tâm, lý do tôi muốn làm điều này là tôi muốn có một giao diện mờ để triển khai với ngữ nghĩa xử lý được chia sẻ. Một số triển khai (các đối tượng không đồng bộ) yêu cầu đối tượng gọi lại đảm bảo rằng đối tượng triển khai vẫn tồn tại (lập luận cho shared_from_this
và weak_ptr::lock
). Các triển khai khác không yêu cầu điều này. Tôi muốn tránh làm lu mờ khái niệm (giao diện công khai) với lớp cơ sở enable_shared_from_this<>
, vì các cặp vợ chồng thực hiện với giao diện - một cái ác đã biết.
Trong hầu hết các trường hợp, bạn nên sử dụng make_shared để tạo đối tượng triển khai. Trong những trường hợp hiếm đòi hỏi một destructor tùy chỉnh, sau đây dường như di động:
auto concept_ptr = static_pointer_cast<concept>(shared_ptr<model> {
new model ,
[](model* self) {
// some_deletion_operation on self;
} });
phụ lục: thông báo lỗi trên kêu vang:
In file included from /Users/richardh/Documents/dev/Scratchpad/tryit/tryit/try2.cpp:1:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/memory:4013:35: error: no viable overloaded '='
__e->__weak_this_ = *this;
~~~~~~~~~~~~~~~~~^~~~~~
...etc...
+1 câu hỏi hay –
Cung cấp các lệnh biên dịch và phiên bản trình biên dịch. –
@LightnessRacesinOrbit nó chỉ ra đó là một sự khác biệt trong việc thực hiện libstdC++ và libC++. –