我可能做了一些明显错误的事情,但为什么会在 MSVC 上打印垃圾?
#include <sdkddkver.h>
#include <boost/asio.hpp>
#include <iostream>
namespace asio = boost::asio;
template <typename Str>
asio::awaitable<void> coro_task(Str&& str) {
std::cout << "coro_task: " << str << std::endl;
co_await asio::this_coro::executor;
}
template <typename Str>
void sync_task(Str&& str) {
std::cout << "sync_task: " << str << std::endl;
}
int main() {
asio::io_context ioc;
asio::co_spawn(ioc.get_executor(), coro_task("hello world"), asio::detached);
asio::post(ioc.get_executor(), [] { sync_task("hello world"); });
ioc.run();
}
例如:
coro_task: ╕÷ⁿäg
sync_task: hello world
我不明白为什么会这样。一定Str
将是静态生命周期char[12] &
,所以我不明白为什么它会得到垃圾数据。
如果我将任何具有暂时生命周期的东西传递给coro_task
(e.g. coro_task(std::string{"hello world"})
)我没有得到输出(str
是空的)。我猜想它是从某个地方搬来的,但不知道在哪里。
尝试为阻塞函数创建通用异步任务/协程包装器时遇到此问题:https://stackoverflow.com/a/75228866/3554391 https://stackoverflow.com/a/75228866/3554391。这个问题代表了这个问题的一个最小例子。
该问题似乎没有发生与 godbolt 上的 gcc 一起使用 https://godbolt.org/#g:!((g:!((g:!((h:codeEditor,i:(filename:%271%27,fontScale:14,fontUsePx:%270%27,j:1,lang:c%2B%2B,selection:(endColumn:2,endLineNumber:23,positionColumn:2,positionLineNumber:23,selectionStartColumn:2,selectionStartLineNumber:23,startColumn:2,startLineNumber:23),source:%27%23include+%3Cboost/asio.hpp%3E%0A%23include+%3Ciostream%3E%0A%0Anamespace+asio+%3D+boost::asio%3B%0A%0Atemplate+%3Ctypename+Str%3E%0Aasio::awaitable%3Cvoid%3E+coro_task(Str%26%26+str)+%7B%0A++std::cout+%3C%3C+%22coro_task:+%22+%3C%3C+str+%3C%3C+std::endl%3B%0A++co_await+asio::this_coro::executor%3B%0A%7D%0A%0Atemplate+%3Ctypename+Str%3E%0Avoid+sync_task(Str%26%26+str)+%7B%0A++std::cout+%3C%3C+%22sync_task:+%22+%3C%3C+str+%3C%3C+std::endl%3B%0A%7D%0A%0Aint+main()+%7B%0A++asio::io_context+ioc%3B%0A++asio::co_spawn(ioc.get_executor(),+coro_task(%22hello+world%22),+asio::detached)%3B%0A++asio::post(ioc.get_executor(),+%5B%5D+%7B+sync_task(%22hello+world%22)%3B+%7D)%3B%0A%0A++ioc.run()%3B%0A%7D%27),l:%275%27,n:%270%27,o:%27C%2B%2B+source+%231%27,t:%270%27)),k:59.375,l:%274%27,n:%270%27,o:%27%27,s:0,t:%270%27),(g:!((g:!((h:compiler,i:(compiler:g131,deviceViewOpen:%271%27,filters:(b:%270%27,binary:%271%27,binaryObject:%271%27,commentOnly:%270%27,debugCalls:%271%27,demangle:%270%27,directives:%270%27,execute:%270%27,intel:%270%27,libraryCode:%270%27,trim:%271%27),flagsViewOpen:%271%27,fontScale:14,fontUsePx:%270%27,j:1,lang:c%2B%2B,libs:!((name:boost,ver:%27182%27)),options:%27-std%3Dc%2B%2B20+-Wall+-Wextra+-pedantic+-Werror+-lpthread%27,overrides:!(),selection:(endColumn:1,endLineNumber:1,positionColumn:1,positionLineNumber:1,selectionStartColumn:1,selectionStartLineNumber:1,startColumn:1,startLineNumber:1),source:1),l:%275%27,n:%270%27,o:%27+x86-64+gcc+13.1+(Editor+%231)%27,t:%270%27)),header:(),l:%274%27,m:70.82658022690438,n:%270%27,o:%27%27,s:0,t:%270%27),(g:!((h:output,i:(compilerName:%27x86-64+gcc+13.1%27,editorid:1,fontScale:14,fontUsePx:%270%27,j:1,wrap:%271%27),l:%275%27,n:%270%27,o:%27Output+of+x86-64+gcc+13.1+(Compiler+%231)%27,t:%270%27)),header:(),l:%274%27,m:29.17341977309562,n:%270%27,o:%27%27,s:0,t:%270%27)),k:40.625,l:%273%27,n:%270%27,o:%27%27,t:%270%27)),l:%272%27,n:%270%27,o:%27%27,t:%270%27)),version:4 or 伴随着铿锵声 https://godbolt.org/#g:!((g:!((g:!((h:codeEditor,i:(filename:%271%27,fontScale:14,fontUsePx:%270%27,j:1,lang:c%2B%2B,selection:(endColumn:2,endLineNumber:23,positionColumn:2,positionLineNumber:23,selectionStartColumn:2,selectionStartLineNumber:23,startColumn:2,startLineNumber:23),source:%27%23include+%3Cboost/asio.hpp%3E%0A%23include+%3Ciostream%3E%0A%0Anamespace+asio+%3D+boost::asio%3B%0A%0Atemplate+%3Ctypename+Str%3E%0Aasio::awaitable%3Cvoid%3E+coro_task(Str%26%26+str)+%7B%0A++std::cout+%3C%3C+%22coro_task:+%22+%3C%3C+str+%3C%3C+std::endl%3B%0A++co_await+asio::this_coro::executor%3B%0A%7D%0A%0Atemplate+%3Ctypename+Str%3E%0Avoid+sync_task(Str%26%26+str)+%7B%0A++std::cout+%3C%3C+%22sync_task:+%22+%3C%3C+str+%3C%3C+std::endl%3B%0A%7D%0A%0Aint+main()+%7B%0A++asio::io_context+ioc%3B%0A++asio::co_spawn(ioc.get_executor(),+coro_task(%22hello+world%22),+asio::detached)%3B%0A++asio::post(ioc.get_executor(),+%5B%5D+%7B+sync_task(%22hello+world%22)%3B+%7D)%3B%0A%0A++ioc.run()%3B%0A%7D%27),l:%275%27,n:%270%27,o:%27C%2B%2B+source+%231%27,t:%270%27)),k:59.375,l:%274%27,n:%270%27,o:%27%27,s:0,t:%270%27),(g:!((g:!((h:compiler,i:(compiler:clang1600,deviceViewOpen:%271%27,filters:(b:%270%27,binary:%271%27,binaryObject:%271%27,commentOnly:%270%27,debugCalls:%271%27,demangle:%270%27,directives:%270%27,execute:%270%27,intel:%270%27,libraryCode:%270%27,trim:%271%27),flagsViewOpen:%271%27,fontScale:14,fontUsePx:%270%27,j:1,lang:c%2B%2B,libs:!((name:boost,ver:%27182%27)),options:%27-std%3Dc%2B%2B20+-Wall+-Wextra+-pedantic+-Werror+-pthread%27,overrides:!(),selection:(endColumn:1,endLineNumber:1,positionColumn:1,positionLineNumber:1,selectionStartColumn:1,selectionStartLineNumber:1,startColumn:1,startLineNumber:1),source:1),l:%275%27,n:%270%27,o:%27+x86-64+clang+16.0.0+(Editor+%231)%27,t:%270%27)),header:(),l:%274%27,m:70.82658022690438,n:%270%27,o:%27%27,s:0,t:%270%27),(g:!((h:output,i:(compilerName:%27x86-64+gcc+13.1%27,editorid:1,fontScale:14,fontUsePx:%270%27,j:1,wrap:%271%27),l:%275%27,n:%270%27,o:%27Output+of+x86-64+clang+16.0.0+(Compiler+%231)%27,t:%270%27)),header:(),l:%274%27,m:29.17341977309562,n:%270%27,o:%27%27,s:0,t:%270%27)),k:40.625,l:%273%27,n:%270%27,o:%27%27,t:%270%27)),l:%272%27,n:%270%27,o:%27%27,t:%270%27)),version:4.
我正在使用 Visual Studio 17.5.5 和 asio 1.25.0。